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