我用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; }
但我不想写自己的布局,我想使用&#34;标准&#34;其他Appenders使用的那个...
任何人都有意见吗?非常感谢
提示:也许这样我们可以访问其他现有记录器的渲染器?
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);
答案 0 :(得分:4)
调用基本方法RenderLoggingEvent根据游览布局编写事件。例如,这里是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));
}
}
答案 1 :(得分:0)
你应该使用 textBox.BeginInvoke 而不是textBox.Invoke或textBox.AppendText来处理线程安全。