自写的 appender 不使用指定的布局
self-written appender does not utilize specified layout
我编写了自己的 appender 以便能够在 WPF TextBox
中输出日志。在这里:
public class TextBoxAppender : AppenderSkeleton
{
private TextBox _tb;
public TextBoxAppender(TextBox tb)
{
_tb = tb;
}
protected override void Append(LoggingEvent loggingEvent)
{
_tb.Text += loggingEvent.RenderedMessage + "\n";
}
}
我像这样初始化了日志并添加了 appender:
var myTextBox = ... // get WPF TextBox from somewhere
var type = GetType();
var assembly = type.Assembly;
var loggerRepo = LogManager.GetRepository(assembly);
var rootLogger = ((Hierarchy)loggerRepo).Root;
Log = LogManager.GetLogger(assembly, type);
var tbAppender = new TextBoxAppender(myTextBox);
rootLogger.AddAppender(tbAppender);
rootLogger.Hierarchy.Configured = true;
并且有效。我没有指定任何布局,所以它只使用一些默认布局:如果我写 Log.Debug("My Message")
那么输出只是 "My Message"
.
现在我想指定我自己的布局。所以我写了这些行:
PatternLayout layout = new PatternLayout();
layout.ConversionPattern = "%level - %message%newline"; // my layout
layout.ActivateOptions();
tbAppender.Layout = layout;
tbAppender.ActivateOptions();
并将它们放在var tbAppender = ...
和rootLogger.AddAppender...
之间的空行中。但它根本不会改变布局!我做错了什么?
据我所知,loggingEvent 被传递给所有活动的附加程序,因此确实了解布局(这是附加程序的 属性)。
我觉得解决办法是调用appenders的RenderLoggingEvent方法,即改变
_tb.Text += loggingEvent.RenderedMessage + "\n";
至
_tb.Text += RenderLoggingEvent(loggingEvent) + "\n";
我编写了自己的 appender 以便能够在 WPF TextBox
中输出日志。在这里:
public class TextBoxAppender : AppenderSkeleton
{
private TextBox _tb;
public TextBoxAppender(TextBox tb)
{
_tb = tb;
}
protected override void Append(LoggingEvent loggingEvent)
{
_tb.Text += loggingEvent.RenderedMessage + "\n";
}
}
我像这样初始化了日志并添加了 appender:
var myTextBox = ... // get WPF TextBox from somewhere
var type = GetType();
var assembly = type.Assembly;
var loggerRepo = LogManager.GetRepository(assembly);
var rootLogger = ((Hierarchy)loggerRepo).Root;
Log = LogManager.GetLogger(assembly, type);
var tbAppender = new TextBoxAppender(myTextBox);
rootLogger.AddAppender(tbAppender);
rootLogger.Hierarchy.Configured = true;
并且有效。我没有指定任何布局,所以它只使用一些默认布局:如果我写 Log.Debug("My Message")
那么输出只是 "My Message"
.
现在我想指定我自己的布局。所以我写了这些行:
PatternLayout layout = new PatternLayout();
layout.ConversionPattern = "%level - %message%newline"; // my layout
layout.ActivateOptions();
tbAppender.Layout = layout;
tbAppender.ActivateOptions();
并将它们放在var tbAppender = ...
和rootLogger.AddAppender...
之间的空行中。但它根本不会改变布局!我做错了什么?
据我所知,loggingEvent 被传递给所有活动的附加程序,因此确实了解布局(这是附加程序的 属性)。
我觉得解决办法是调用appenders的RenderLoggingEvent方法,即改变
_tb.Text += loggingEvent.RenderedMessage + "\n";
至
_tb.Text += RenderLoggingEvent(loggingEvent) + "\n";