NServiceBus和Log4Net外部配置文件

3

我更喜欢使用外部配置文件来进行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));

EndpointConfig中的Configure.With之前。通过这个方法,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?

  1. 从外部配置文件中读取配置文件(即log4net配置不在app.config中)
  2. 监听外部配置文件,以便任何对外部配置文件的更改都可以反映出来。

确保您在端点配置中添加了IWantCustomLogging。 - Andreas Öhlund
我相信我在第二个选项中做了那件事,但我会再检查一遍并告诉你。 - amit_g
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "ApplicationName.log4net.xml", Watch = true)] 无论是否启用 IWantCustomLogging,都不会产生任何影响。日志甚至没有被定向到所需的文件中,因此此设置毫无作用。 - amit_g
第二种方式重定向日志,这意味着它读取外部配置文件,但是没有办法(至少我不知道)指定“Watch”属性,因此log4net不会监视该文件。在这种情况下,IWantCustomLogging用于端点配置。 - amit_g
第三种方法,log4net似乎从app.config文件中读取值,因此无论我在端点配置中做什么都无所谓,但是我已经尝试过没有IWantCustomLogging,使用IWantCustomLogging,使用SetLoggingLibrary.Log4Net(log4net.Config.XmlConfigurator.Configure)的调用以及不使用SetLoggingLibrary.Log4Net(log4net.Config.XmlConfigurator.Configure)的调用。根据app.config设置重定向日志,但未被监视。 - amit_g
2个回答

6

6

如果您正在使用程序集属性,请使用以下方法:

SetLoggingLibrary.Log4Net(); // no parameters

这应该也可以工作:
SetLoggingLibrary.Log4Net(() => XmlConfigurator.ConfigureAndWatch(log4netConfigFileInfo));

或者这样:
XmlConfigurator.ConfigureAndWatch(log4netConfigFileInfo)
SetLoggingLibrary.Log4Net();

我无法让程序集属性起作用。主机似乎根本没有读取它。但是,我能够使用ConfigureAndWatch方法,它可以正常工作。谢谢。 - amit_g
有一件小事,ConfigureAndWatch 不接受 Uri。它需要传递 FileInfo 对象。 - amit_g
我不是百分之百确定,但可能是由于端点加载到单独的应用程序域的方式。很高兴ConfigureAndWatch能正常工作。 - Johannes Gustafsson

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