log4net 仅将消息记录到少数附加程序

log4net log messages only to a few appenders

我正在使用 log4net api 登录我的 WinForms 应用程序。我有多个附加程序:RollingFileAppender 和 TextBoxAppender(自定义附加程序)。

我只想在日志文件 (RollingFileAppender) 中记录一些错误消息,而不是在文本框 (TextBoxAppender) 中记录一些错误消息,而一些其他消息则同时记录在两者中。我怎样才能实现它?请注意,消息的级别相同,即所有错误消息。

谢谢。

编辑 1:

具体来说,我想在 UI 以及日志文件中显示简单的一行错误消息,但 StackTraces 仅在日志文件中显示。

针对不同的appender输出不同的消息应该是ForwardingAppender(logging.apache上的文档目前好像已经down了,不过这里还是link: https://logging.apache.org/log4net/release/sdk/log4net.Appender.ForwardingAppender.html)

在这里,您可以根据日志级别(大多数示例)进行过滤,也可以根据日志消息进行过滤(查看此处:http://www.codeproject.com/Articles/140911/log-net-Tutorial,段落 "StringMatchFilter")

至少,这可以帮助您将这条消息仅传递给一个特定的 Appender。 要确定如何省略堆栈跟踪,请参阅 Jeroen Mosterts 的回答

据我了解,您实际上希望将消息发送到两个附加程序,但其中只有一个记录堆栈跟踪。首先,记录包含异常的消息作为异常,不要使用 Exception.ToString():

logger.Error($"Something went wrong frobbing the widget: {ex.Message}", ex);

然后您的记录器可以使用多个附加程序,其中一些通过告诉 log4net 我们将处理异常(实际上不对它们执行任何操作)来省略堆栈跟踪:

<appender name="TextBoxAppender" type="MyAppenders.TextBoxAppender">
    <layout type="log4net.Layout.PatternLayout">
        <ignoresException value="false" />
        <conversionPattern value="%m%n" /> 
    </layout>
</appender>

以及其他具有完整详细信息的人:

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
    ...
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d{ISO8601} [%t] %-5p %c - %m%n" />
    </layout>
</appender>