我正在调试我编写的自定义log4net Appender
。我的设置在配置文件中使用此标准PatternLayout
:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout
在Append()
方法实现中,如果我调用RenderLoggingEvent()
,它会返回格式正确的消息。但是,loggingEvent的Renderedmessage
仅包含%message
位。
RenderLoggingEvent()
返回:
“2015-06-09 14:09:37,382 [主要主题] INFO MyConsole.Program [(null)] - 线程测试\ r \ n“
loggingEvent.RenderedMessage
包含:
“线程测试”
RenderedMessage
应该如何运作?
我需要在Appender
之外呈现消息,所以我宁愿不使用它的RenderLoggingEvent()
方法。是否有更直接的方法从LoggingEvent
实例获取呈现的消息?
答案 0 :(得分:3)
你说你需要在Appender之外呈现消息,但是布局与appender相关联。
假设您可以解决此问题并以某种方式访问布局,那么您可以调用Format method on the layout:
PatternLayout layout = … ;
string result;
using (StringWriter writer = new StringWriter())
{
layout.Format(writer, loggingEvent);
result = writer.ToString();
}
测试输出:
2015-06-09 14:06:43,457 [14]错误测试[NDC] - 测试消息
答案 1 :(得分:1)
在扩展AppenderSkeleton
以编写自定义Appender时,您已经可以将布局作为属性。然后,您可以在Appender中编写一个方法:
这是我的代码(在TextBoxAppender.cs中),继承了AppenderSkeleton
:
private string GetLayoutedMessage(LoggingEvent loggingEvent) {
using (StringWriter writer = new StringWriter())
{
Layout.Format(writer, loggingEvent);
return writer.ToString();
}
}