2012-06-08 32 views
1

我使用的是log4net的MemoryAppender显示在窗体的文本框我的log4net的输出错过高速日志事件。我的配置文件的相关部分是:log4net的MemoryAppender似乎

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

我喜欢我自己的用户界面更好,虽然如此,我仍然在寻找答案。

+0

在你关心的情况下,有电锯的一吨的新功能开发快照,看看这里:http://people.apache.org/~sdeboy – Scott

+0

酷。谢谢。 – chrismead

回答

3

我认为会发生以下情况:当你在文本框中写入日志消息,新的消息被记录。当您在附加器清除的消息,你也可以删除这些新的消息,这些消息不写入文本框。

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

public class MyMemoryAppender : MemoryAppender 
{ 
    public LoggingEvent[] GetAndClearEvents() 
    { 
     lock (m_eventList.SyncRoot) 
     { 
      var events = (LoggingEvent[]) m_eventsList.ToArray(typeof(LoggingEvent)); 
      m_eventsList.Clear(); 
      return events; 
     } 
    } 
} 
+0

太棒了。听起来很好的建议。我一回到工作岗位就会检查一下。 – chrismead

+0

我仍然无法得到它的工作,但问题很可能是在我的项目在其他地方。感谢您的想法! – chrismead