我更喜欢log4net的外部配置文件,因为log4net可以监控这些文件,并且可以在不修改app / web.config文件的情况下更改级别。我在NServiceBus中努力做到这一点。我正在使用这是我的外部配置文件
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingFile" type="log4net.Appender.FileAppender">
<file value="C:\Logs\NServiceBusApplication.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d{hh:mm:ss} %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="RollingFile" />
</root>
</log4net>
最简单的方法是在AssemblyInfo.cs中放置一个属性
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "ApplicationName.log4net.xml", Watch = true)]
这在NServiceBus中不起作用(我使用的是NServiceBus.Host.exe)。然后我试着打电话
SetLoggingLibrary.Log4Net(() => XmlConfigurator.Configure(log4netConfigUri));
Configure.With
之前的EndpointConfig
之前的。使用此log4net从正确的位置读取配置文件,它不会注意它,所以当我更改日志级别时,它不会反映在应用程序中。
接下来我尝试了appSettings
<appSettings>
<add key="log4net.Config" value="ApplicationName.log4net.xml"/>
<add key="log4net.Config.Watch" value="True"/>
</appSettings>
同样,log4net读取此内容并随后读取ApplicationName.log4net.xml,它仍然没有注意它。
如何在使用NServiceBus.Host.exe的NServiceBus服务中配置log4net
答案 0 :(得分:6)
如果您使用的是程序集属性,请使用:
SetLoggingLibrary.Log4Net(); // no parameters
这也应该有效:
SetLoggingLibrary.Log4Net(() => XmlConfigurator.ConfigureAndWatch(log4netConfigFileInfo));
或者这个:
XmlConfigurator.ConfigureAndWatch(log4netConfigFileInfo)
SetLoggingLibrary.Log4Net();
答案 1 :(得分:6)
NServiceBus&gt; = 5.0 为log4Net提供单独的nugetPackage:NServiceBus.Log4Net
而不是致电:SetLoggingLibrary.Log4Net(x => ...);
使用以下语句:
log4net.Config.XmlConfigurator.Configure();
LogManager.Use<Log4NetFactory>();
或者参考这个示例,了解如何以编程方式配置appender: https://github.com/Particular/NServiceBus.Log4Net/blob/develop/src/Sample/LoggingConfig.cs