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

本文关键字:错误 日志 文件 外部 DLL 调用 log4net | 更新日期: 2023-09-27 18:30:54

我在这里遇到的奇怪问题。

因此,此应用程序将其所有日志文件写入名为 Log1 的目录,并在主文件中.log该文件中。

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

但现在奇怪的想法发生了。在第一次写入第二个之后.log来自主应用程序的所有进一步日志消息都将写入第二个.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 [%property{NDC}] - %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 调用后写入错误的日志文件

当然,

您正在调用的库会在主log4net存储库上触发重新配置。此配置可以从您定义的配置文件以外的其他配置文件加载,也可以以编程方式加载。

您有一些选择:

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