外部 dll 调用后 log4net 写入错误的日志文件

Posted

技术标签:

【中文标题】外部 dll 调用后 log4net 写入错误的日志文件【英文标题】:log4net writes to wrong logfile after external dll call 【发布时间】:2014-11-18 12:46:51 【问题描述】:

我遇到了奇怪的问题。

所以这个应用程序正在将他们所有的日志文件写入一个名为 Log1 的目录,并在 main.log 文件中。

现在如果调用外部 dll。 我们知道这个 dll 也使用 log4net 来写入另一个日志文件。 它写入 Log2 目录和文件 second.log

但现在奇怪的想法发生了。 在第一次写入 second.log 之后,来自我们主应用程序的所有其他日志消息都将写入这个 second.log 文件。

在主应用App.config中有如下设置:

<appSettings>
    <add key="logDirectory" value="Log1" />
    <add key="logFileName" value="main" />
    <add key="logFileExtension" value="log" />
    <add key="logFilesToArchive" value="10" />
    <add key="personalizationDirectory" value="Personalization" />
    <add key="useMockService" value="true" />
    <add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>


  <log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net">
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%date [%thread] %-5level - %logger (Line %line) - %message%newline%exception" />
      </layout>
    </appender>
    <root>
      <priority value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
    </root>
  </log4net>

这个外部 dll 对 log4net 有以下配置:

  <appender name="OutputDebugStringAppender" type="log4net.Appender.OutputDebugStringAppender" >
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%propertyNDC] - %message%newline" />
    </layout>
  </appender>

  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="INFO" />
    <appender-ref ref="RollingLogFileAppender" />
  </root>

  <logger name="NamespaceXYZ.Test">
    <level value="DEBUG" />
    <appender-ref ref="OutputDebugStringAppender" />
    <appender-ref ref="ConsoleAppender" />
  </logger>

为什么会这样?

感谢您的意见 :)

【问题讨论】:

我不确定,但您在帖子中包含的 log4net 配置似乎不完整。具体来说,“外部 dll”配置是指“RollingLogFileAppender”,但没有针对 RollingLogFileAppender 的任何配置。它仅显示 OutputDebugStringAppender 和 ConsoleAppender 的配置。此外,这并不能回答您的问题,但我想知道为什么您不将所有内容都配置为登录到同一个文件?看起来这样调试会更容易。 另外,如果您在 SO 上查看此链接,您通常会看到应用程序中的第二个 log4net 配置文件(可能包括外部 dll 读取的配置文件)将覆盖主应用程序的 log4net 配置文件中的设置。 【参考方案1】:

肯定会发生的是,您调用的库会触发main log4net repository 上的重新配置。此配置可以从您定义的配置文件之外的另一个配置文件中加载,或者以编程方式加载。

你有一些选择:

如果您有程序集的代码,请使用RepositoryAttribute 为程序集中的所有记录器指定自定义存储库。这样,您的配置可以与程序集配置一起使用 如果您无法更改程序集,请在您的代码上使用不同的存储库,以便让两个日志记录配置并存。这可能会迫使您重写所有记录器存储库调用以指定命名存储库。 在配置记录器之前对程序集进行虚拟调用;这样你就可以覆盖程序集的配置

【讨论】:

以上是关于外部 dll 调用后 log4net 写入错误的日志文件的主要内容,如果未能解决你的问题,请参考以下文章

3rd 方库是指不同版本的 log4net.dll

调试问题总结

使用外部 DLL 时 PL/I 中的错误处理?

未找到log4net .netcore 3.1方法

如何使用 log4net 日志框架

WPF使用Log4net.dll库的demo(转载加个人观点)