外部 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 写入错误的日志文件的主要内容,如果未能解决你的问题,请参考以下文章