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; }

しかし、私は自分のレイアウトを書きたくありません。他のアペンダーが使用する「標準」のものを使用したいと思います...

誰かアイデアはありますか?どうもありがとう

ヒント: この方法で、他の既存のロガーのレンダラーにアクセスできるのではないでしょうか?

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

解決

RenderLoggingEvent の直前の Append() で、レイアウトを設定します。それ以外の場合は 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.Invoke または textBox.AppendText の代わりに textBox.BeginInvoke使用する必要があります。

于 2016-10-13T08:56:58.630 に答える