1

我正在使用 log4net MemoryAppender 在表单文本框中显示我的 log4net 输出。我的配置文件的相关部分是:

<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender" >
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level %date %message%newline" />
    </layout>
</appender>

更新表单的代码由计时器触发,如下所示:

var events = _memoryAppender.GetEvents();

foreach (var loggingEvent in events)
{
    textBoxOutput.Text += loggingEvent.Level + "  " + loggingEvent.MessageObject + Environment.NewLine;
}
_memoryAppender.Clear();

它正在工作,但是当我的应用程序在短时间内记录大量消息时,我似乎看不到它们。有谁知道发生了什么?

作为一种解决方法,我使用的是Chainsaw和 UDP appender:

   <appender name="UdpAppender" type="log4net.Appender.UdpAppender">
    <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO"/>
        <param name="LevelMax" value="ERROR"/>
    </filter>
    <param name="RemoteAddress" value="127.0.0.1" />
    <param name="RemotePort" value="8080" />
    <layout type="log4net.Layout.XmlLayoutSchemaLog4j, log4net" />
</appender>

不过,我更喜欢我自己的 UI,所以我仍在寻找答案。

4

1 回答 1

3

我假设会发生以下情况:当您在文本框中编写日志消息时,会记录新消息。当您清除附加程序中的消息时,您还会删除这些新消息,这些消息不会写入文本框。

您可以通过在开始将消息写入文本框之前清除附加程序来改善这种情况,但我认为您应该创建自己的内存附加程序并提供一种返回消息并一步清除数组的方法。像这样的东西:

public class MyMemoryAppender : MemoryAppender
{
    public LoggingEvent[] GetAndClearEvents()
    {
        lock (m_eventList.SyncRoot)
        {
            var events = (LoggingEvent[]) m_eventsList.ToArray(typeof(LoggingEvent));
            m_eventsList.Clear();
            return events;
        }
    }
}
于 2012-06-09T10:30:57.070 回答