4

我用 log4net 创建了自己的 Appender,

 public class TextBoxAppender : AppenderSkeleton
{
      ...(constructor and other stuff omitted)...

        protected override void Append(log4net.Core.LoggingEvent loggingEvent)
        {
              var msg = string.Concat(loggingEvent.RenderedMessage, "\r\n");

              _textBox.AppendText(s);

        }

}

我的 App.config 有一个我想使用的 PatternLayout,

 <appender name="TextBoxAppender" type="log4netAppender.TextBoxAppender">
      <root>
        <level value="DEBUG">
          <appender-ref ref="TextBoxAppender">
          </appender-ref>
        </level>
      </root>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{dd MMM yyyy HH:mm:ss} %level - %message%newline%exception%newline" />
      </layout>
    </appender>

loggingEvent.RenderedMessage 没有给我用 PatternLayout 格式化的字符串。

我看到 AppendSkeleton 有这个签名

public virtual ILayout Layout { get; set; }

但我不想编写自己的布局,我想使用其他 Appender 使用的“标准”布局......

有人知道吗?非常感谢

提示:也许这样我们可以访问其他现有记录器的渲染器?

var hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.RendererMap .....

解决方案

在 Append() 中,在 RenderLoggingEvent 之前,设置 Layout,否则为 null。

this.Layout = new log4net.Layout.PatternLayout("%date{dd MMM yyyy HH:mm:ss} %level - %message");
string msg = base.RenderLoggingEvent(loggingEvent);
4

2 回答 2

4

调用基本方法 RenderLoggingEvent 以根据您的游览布局编写您的事件。例如这里是 Append 方法TraceAppender

// log4net.Appender.TraceAppender
protected override void Append(LoggingEvent loggingEvent)
{
    Trace.Write(base.RenderLoggingEvent(loggingEvent), this.m_category.Format(loggingEvent));
    if (this.m_immediateFlush)
    {
        Trace.Flush();
    }
}

所以在你的情况下:

public class TextBoxAppender : AppenderSkeleton
{
    ...(constructor and other stuff omitted)...
    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
    {
        // format your message in the layout, not here
        // var msg = string.Concat(loggingEvent.RenderedMessage, "\r\n");
        _textBox.AppendText(base.RenderLoggingEvent(loggingEvent));
    }
}
于 2015-03-23T12:34:15.073 回答
0

您应该使用textBox.BeginInvoke而不是 textBox.Invoke 或 textBox.AppendText 以获得线程安全。

于 2016-10-13T08:56:58.630 回答