为特定 类 配置 Log4Net 和超出范围的错误处理

Configuring Log4Net for specific classes and overreaching error handling

我在我的项目中使用 Log4Net,并希望对其进行配置,以便 debug/info 消息发送到特定于每个 class 的文件,所有错误消息发送到一个中央文件。

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

我很难找到执行此操作的 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.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 的 class 的所有消息都写入了 Debug.log 文件和 Worker1.log 文件。如果它们已经写入 Worker1.log,我不想将它们写入 Debug.log。

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

但是,这样做可以防止将错误写入 Error.log 发生的情况是,如果我设置 additivity = "false" 并记录错误,它会写入 Worker1.log,但不会写入 Error.log.

有什么方法可以让加法只应用于 debug/info 消息,这样我就可以在 Worker1.log 中有调试消息,在 Error.log 中有错误消息,以及任何调试debug.log 文件中不特定于记录器的消息?

你关于设置 additivity="false"debug 消息隔离到 Worker1.log 的做法是正确的。

要将 Worker1error 消息返回到 Error.log,您还必须在 Worker1 logger声明,如下图

<logger name="Worker1" additivity="false">
    <level value='DEBUG'/>
    <appender-ref ref="Worker1" />
    <appender-ref ref="ErrorLog" />
</logger>

通过此设置,您可以否决 root 中定义的规则,以对 debug 消息使用自定义 Worker1 Appender,并使用相同的 Error Appendererror 封邮件。