Log4net:为什么在RenderedMessage中忽略了Pattern Layout?

时间:2015-06-09 11:18:53

标签: log4net log4net-appender

我正在调试我编写的自定义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实例获取呈现的消息?

2 个答案:

答案 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();
    }
}