2012-06-08 57 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