1、背景说明
网上log4net的文章很多,这两天打算用一下,结果总是没有日志信息。并且IsDebugEnabled
、IsErrorEnabled
、IsFatalEnabled
、IsInfoEnabled
均为false
。见下图所示
2、原因分析及解决方案
2.1 一般原因
网上搜的比较多的解决方案有:
1、log4net.config
文件的复制到输出目录
属性,必须设置为:始终复制
或如果较新则复制
。
2、将log4net.config
文件复制到bin/debug
或bin/release
下
2.2 最终原因
按以上操作仍然没有效果。所以逐步排除及确认问题
1、判断是否为读取配置文件的问题
在程序中通过bool settingFlag= log4net.LogManager.GetRepository().Configured;
判断是否为读取配置文件的异常。
2、若上面的语句返回false
,则代表配置文件有问题。而配置文件的读取语句为:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
。
因此进行如下的操作:
将配置文件的地址设为绝对路径,即:[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"D:\Test\DrugInfo\Source-DrugInfoAPI\DrugInfo.Service\log4net.config", ConfigFileExtension = "config", Watch = true)]
。此时运行,则可正常输出日志。说明之前的路径配置有问题。
3、因此将webapi应用进行发布,发现log4net.config
在bin
文件夹下。因此配置文件需要设定为:[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"bin\log4net.config", Watch = true)]
以上,便可解决问题
3、解决方案
网上的实现方式往往是在同一个项目下添加了log4net
,而像webapi
或网站的往往包含多个项目,所以路径问题要复杂一些
后记(2023-3-7)
这个本质上是网站读取配置文件的问题。总来的来说有两个注意事项。
1、非网站项目的其他项目的配置文件。要在属性上,选择复制。这样配置文件才会到bin目录下。原因是非网站项目往往是类库,它不需要配置文件的。若不选复制,程序会忽略这个配置文件。
2、网站项目在读取配置文件时,会默认读取跟目录的web.config。若要读取其他配置文件,则需要到bin文件夹去寻找,因此寻找路径要在bin文件夹下。
网站的配置文件读取原则:配置文件读取