Log4Net分离配置文件无法工作。

10

我遇到了一个奇怪的问题。我在一个解决方案中有多个项目,其中一个是 WebAPI,记录日志工作正常。还有一个是 MVC 管理站点,但无法记录日志。这是我尝试过的:

我的日志记录代码:

var log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Info("Some log message");  

在assemblyInfo中,我尝试了以下每个...

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "logging.config", Watch = true)]
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "C:\\full_path\\logging.config", Watch = true)]  
在Global.asax的application_start方法中,我尝试了以下操作(移除assemblyInfo行)。
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo("Logging.config"));
var log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Info("Application starting");  

这也不会创建日志。唯一能够创建日志的方法是使用global.asax中的代码以及logging.config的完整路径。

我很困惑,因为WebAPI只需使用AssemblyInfo并且仅使用相对路径即可工作。我还创建了一个带有MVC项目的样本虚拟解决方案(相对路径),在那里它也能正常工作。

有任何想法吗?

更新-发现问题

我必须在Application_Start中设置配置文件观察器:

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "logging.config"));

事实证明,DotNetOpenAuth.Core.dll使用log4net,因此使用AssemblyInfo解决方案将无法起作用。我在这篇博客中找到了详细信息:http://hanskindberg.wordpress.com/2013/04/07/log4net-configuration/

谢谢。


是否存在权限问题(在IIS下运行并尝试写入文件可能会有问题)?您尝试过调试吗?您尝试在示例application_start代码中使用完整路径了吗?您的配置是否具有根元素,或者与DeclaryingType打印出来的内容匹配? - matth
权限问题:我不这么认为,因为在global.asax中使用完整路径运行它是可以的。 - BCarlson
调试:在VS2012中,当我记录日志时,它只是执行而没有错误。Log4Net调试,我一直无法让它记录任何东西。同样的配置基于相对/完整路径和全局与assemblyInfo,工作或不工作很令人困惑。 - BCarlson
找到了问题。我的MVC项目引用了DotNetOpenAuth.Core.dll。这个程序集使用Log4Net,并在执行AssemblyInfo行之前被调用。我找到了这篇文章,给了我详细的信息:http://hanskindberg.wordpress.com/2013/04/07/log4net-configuration/。 - BCarlson
2个回答

13

我必须在Application_Start中设置配置文件监视器:

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "logging.config"));

原来DotNetOpenAuth.Core.dll使用log4net,这将导致使用AssemblyInfo解决方案无法正常工作。我在这篇博客中找到了详细信息:http://hanskindberg.wordpress.com/2013/04/07/log4net-configuration/(请查看提到DotNetOpenAuth.Core.dll的段落)。


3
我为这个问题苦恼了很多天。最终我找到了以下解决方案: [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)],再加上@BCarlson建议的配置。
XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));

总结一下,我创建了一个c#控制台项目的示例,使用外部log4net.config文件进行log4net配置。 https://github.com/riddhik84/Log4net-Tutorial


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接