log4net只将日志消息发送给几个appender

时间:2016-09-26 13:41:53

标签: c# log4net log4net-configuration

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

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

感谢。

编辑1:

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

2 个答案:

答案 0 :(得分:2)

据我所知,你实际上希望消息转到两个appender,但只有一个记录堆栈跟踪。首先,将包含异常的日志消息作为例外,不要使用Exception.ToString()

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

然后你的记录器可以使用多个appender,其中一些通过告诉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>

答案 1 :(得分:1)

向不同的appender输出不同消息的解决方案应该是ForwardingAppender(有关logging.apache的文档目前似乎已经失效,但无论如何这里是链接:https://logging.apache.org/log4net/release/sdk/log4net.Appender.ForwardingAppender.html

在这里你可以根据loglevel(大多数例子)进行过滤,也可以根据日志消息进行过滤(看看这里:http://www.codeproject.com/Articles/140911/log-net-Tutorial,段落“StringMatchFilter”)

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