【问题标题】:NServiceBus and Log4Net external config fileNServiceBus 和 Log4Net 外部配置文件
【发布时间】:2013-03-22 22:27:09
【问题描述】:

我更喜欢 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 添加到端点配置中?
  • 我相信我在第二个选项中做到了,但我会再检查一次并告诉你。
  • [assembly: log4net.Config.XmlConfigurator(ConfigFile = "ApplicationName.log4net.xml", Watch = true)] 有或没有 IWantCustomLogging 都没有影响。日志甚至没有定向到所需的文件,因此此设置没有影响。
  • 第二种方式重定向日志,这意味着它读取外部配置文件,但没有办法(我不知道)指定“Watch”属性,因此 log4net 不会监视该文件。在这种情况下,IWantCustomLogging 用于端点配置。
  • 第三种方式,log4net 似乎从 app.config 文件中读取值,因此我在端点配置中执行的操作并不重要,但我尝试不使用 IWantCustomLogging,使用 IWantCustomLogging,调用 SetLoggingLibrary。 Log4Net(log4net.Config.XmlConfigurator.Configure);并且无需调用 SetLoggingLibrary.Log4Net(log4net.Config.XmlConfigurator.Configure);。日志根据 app.config 设置重定向,但不被监视。

标签: log4net nservicebus


【解决方案1】:

如果您使用的是程序集属性,请使用:

SetLoggingLibrary.Log4Net(); // no parameters

这也应该有效:

SetLoggingLibrary.Log4Net(() => XmlConfigurator.ConfigureAndWatch(log4netConfigFileInfo));

或者这个:

XmlConfigurator.ConfigureAndWatch(log4netConfigFileInfo)
SetLoggingLibrary.Log4Net();

【讨论】:

  • 我无法让程序集属性工作。楼主好像根本没看懂。但是,我能够使用 ConfigureAndWatch 方法并且有效。谢谢。
  • 一件小事,ConfigureAndWatch 不接受 Uri。它期望传递 FileInfo 对象。
  • 我不能 100% 确定,但这可能是因为端点加载到单独的应用程序域的方式。很高兴 ConfigureAndWatch 工作。
【解决方案2】:

NServiceBus >= 5.0 有一个单独的用于 log4Net 的 nugetPackage:NServiceBus.Log4Net

而不是调用:SetLoggingLibrary.Log4Net(x =&gt; ...);

使用以下语句:

log4net.Config.XmlConfigurator.Configure();
LogManager.Use<Log4NetFactory>();

或参考此示例了解如何以编程方式配置附加程序: https://github.com/Particular/NServiceBus.Log4Net/blob/develop/src/Sample/LoggingConfig.cs

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多