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

时间:2014-11-18 12:46:52

标签: c# logging dll log4net

我在这里有一个奇怪的问题。

因此,此应用程序将所有日志文件写入名为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 [%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>

为什么会这样?

感谢您的意见:)

1 个答案:

答案 0 :(得分:2)

当然发生的事情是您正在调用的库会触发main log4net repository上的重新配置。此配置可以从您定义的配置文件或以编程方式加载。

你有一些选择:

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