为特定 类 配置 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
的做法是正确的。
要将 Worker1
的 error
消息返回到 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
Appender
error
封邮件。
我在我的项目中使用 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
的做法是正确的。
要将 Worker1
的 error
消息返回到 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
Appender
error
封邮件。