我正在使用log4net api登录我的WinForms应用程序。我有多个appender:RollingFileAppender和TextBoxAppender(自定义appender)。
我想仅在日志文件(RollingFileAppender)中记录一些错误消息,而不是在文本框(TextBoxAppender)中记录一些错误消息,以及其他一些消息。我怎样才能实现它?请注意,消息具有相同的级别,即所有ERROR消息。
感谢。
编辑1:
具体来说,我想在UI中显示简单的一行ERROR消息以及日志文件,但只在日志文件中显示StackTraces。
答案 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回答