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存储库上触发重新配置。此配置可以从您定义的配置文件以外的其他配置文件加载,也可以以编程方式加载。
您有一些选择:
- 如果您有程序集的代码,请使用
RepositoryAttribute
为程序集中的所有记录器指定自定义存储库。这样,您的配置就可以与程序集配置共存 - 如果无法更改程序集,请在代码上使用不同的存储库,以便两个日志记录配置并排存在。这可能会强制您重写所有记录器存储库调用以指定指定的存储库。
- 在配置记录器之前对程序集进行虚拟调用;这样就可以覆盖程序集的配置