为特定类配置Log4Net和超越错误处理

时间:2019-05-14 14:21:10

标签: log4net log4net-configuration

我在项目中使用Log4Net,并希望对其进行配置,以便调试/信息消息转到特定于每个类的文件,所有错误消息转到中央文件。

在我的应用程序中,我有几个“工人”。我希望每个工作人员都有自己的日志文件来捕获调试消息。如果我收到未在特定工作程序上捕获的调试消息,则希望将其记录到中央调试文件中。我还希望有一个集中的错误日志记录,其中任何工人的所有错误都记录在同一文件中。

我很难弄清楚XML配置来做到这一点。 这是我来的最接近的东西:

  <log4net>
    <appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
      <file value="logs\debug.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="ddMMyyyy" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="FATAL" />
      </filter>
    </appender>
    <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
      <file value="logs\error.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="ddMMyyyy" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline%stacktrace{1}%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="ERROR" />
        <levelMax value="FATAL" />
      </filter>
    </appender>
    <appender name="Worker1" type="log4net.Appender.RollingFileAppender">
      <file value="logs\Worker1.log" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <datePattern value="ddMMyyyy" />
      <maxSizeRollBackups value="100" />
      <maximumFileSize value="100MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="INFO" />
      </filter>
    </appender>
    <appender name="Worker2" type="log4net.Appender.RollingFileAppender">
      <file value="logs\Worker2.log" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <datePattern value="ddMMyyyy" />
      <maxSizeRollBackups value="100" />
      <maximumFileSize value="100MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="INFO" />
      </filter>
    </appender>
    <appender name="Worker3" type="log4net.Appender.RollingFileAppender">
      <file value="logs\3.log" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <datePattern value="ddMMyyyy" />
      <maxSizeRollBackups value="100" />
      <maximumFileSize value="100MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="INFO" />
      </filter>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="DebugLog" />
      <appender-ref ref="ErrorLog" />
    </root>
    <logger name="Worker1">
      <level value='DEBUG'/>
      <appender-ref ref="Worker1" />
    </logger>
    <logger name="Worker2">
      <level value='DEBUG'/>
      <appender-ref ref="Worker2" />
    </logger>
    <logger name="Worker3">
      <level value='DEBUG'/>
      <appender-ref ref="Worker3" />
    </logger>
  </log4net>

我遇到的第一个问题是,所有写入Worker1的类的消息均写入Debug.log文件和Worker1.log文件。如果它们已经被写入Worker1.log,我不希望它们被写入Debug.log。

我可以通过更改部分,添加可加性= false来解决此问题。在这种情况下,它将写入Worker1.log,而不是Debug.log文件。

但是,这样做可以防止将错误写入Error.log 发生的事情是,如果我将additivity设置为“ false”并记录了一个错误,它将被写入Worker1.log,但不会被写入Error.log。

有没有办法使可加性仅适用于debug / info消息,这样我就可以在Worker1.log中具有Debug消息,在Error.log中具有Error消息,以及不是特定于a的任何调试消息。 logger中是否有debug.log文件?

1 个答案:

答案 0 :(得分:0)

设置additivity="false"以将debug消息隔离到Worker1.log上是正确的。

要将error的{​​{1}}条消息返回到Worker1中,还必须在Error.log ErrorLog声明中包含Worker1附加程序,如下所示。

logger

通过此设置,您可以否决<logger name="Worker1" additivity="false"> <level value='DEBUG'/> <appender-ref ref="Worker1" /> <appender-ref ref="ErrorLog" /> </logger> 中定义的规则,以对root消息使用自定义Worker1 Appender和相同的debug {{ 1}}个Error邮件。