c# - log4net AppenderSkeleton 忽略 PatternLayout

标签 c# log4net log4net-appender

我用 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);

最佳答案

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

中的 Append 方法
// 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));
    }
}

关于c# - log4net AppenderSkeleton 忽略 PatternLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29209289/

相关文章:

c# - .Net Standard 上的 Log4Net 没有用于在没有存储库的情况下获取记录器的版本

design-patterns - 如何使用 log4net 进行依赖注入(inject)

c# - 从 appender 访问过滤器属性

c# - 使用 log4net 写入不同的记录器

C# 从BackgroundWorker 更新DataGridView

c# - 一些 mvvm 问题 - 知道哪个 View 当前正在编辑实体

c# - 从 MessageController 的 BuildForm 方法访问 LUIS 实体

Log4Net 级别数值

c# - 如何模拟引用私有(private)对象实例的 .NET 代码?

logging - 如何在 log4net 中将级别记录为单个字母?