2011-08-12 49 views
5

我正在嘗試爲企業庫日誌記錄編寫自定義跟蹤偵聽器,它將所有日誌消息發送到任意WCF端點。這背後的想法是,我可以在另一端設置一個簡單的控制檯應用程序等,它可以實時打印所有日誌消息。企業庫日誌記錄:將消息發送到任意WCF端點的自定義跟蹤偵聽器

我的問題是兩個部分:

  1. 是否有一個機制,已經做到這一點?我已經看過MSMQ監聽器,並且我對此沒有興趣,因爲我可能需要在某個時候使用不同的協議/綁定。
  2. 我在下面實現的方式 - 是否足夠高效或有更好的方法?我擔心的是,每次記錄器發出的消息(可能會頻繁出現),我都會打開一個新頻道,然後關閉它。這會造成性能問題嗎?

在我的樣本RemoteClient派生自ClientBase<T>

[ConfigurationElementType(typeof(CustomTraceListenerData))] 
public class RemoteTraceListener : CustomTraceListener 
{ 
    public override void Write(string message) 
    { 
     RemoteClient client = new RemoteClient(); 
     client.Open(); 
     client.Write(message); 
     client.Close(); 
    } 

    public override void WriteLine(string message) 
    { 
     RemoteClient client = new RemoteClient(); 
     client.Open(); 
     client.WriteLine(message); 
     client.Close(); 
    } 

    public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data) 
    { 
     if (data is LogEntry && this.Formatter != null) 
     { 
      WriteLine(this.Formatter.Format(data as LogEntry)); 
     } 
     else 
     { 
      WriteLine(data.ToString()); 
     } 
    } 
} 

回答

0

我找到了一個名爲'CLog'的開源項目,它正是我要找的:http://clog.codeplex.com/

對源代碼的簡要介紹顯示他使用單例對象來跟蹤將接收日誌消息的所有開放通道,他將使用ChannelFactory<TChannel>而不是ClientBase<T>來實例化每個通道代理。有一些需要解決的線程影響,但我仍然認爲這是飛行的方式。

不應該太難用這個作爲實現我自己的自定義跟蹤監聽器的起點,這個監聽器會記錄到WCF端點。

0

本段文字用途本用戶?我建議WCF流媒體作爲一個更好的選擇,你會頻繁登錄。

如果失敗了,最好讓客戶端實例保持儘可能長的時間。你可以嘗試彙集它。

+0

我不清楚你的意思是「彙集」它。 IIS中是否有某種緩存機制可以使用,或者是否將它作爲某種單例實現?另外,流媒體是什麼意思?你的意思是像使用會話的TCP綁定?這意味着要保持渠道暢通,對嗎?我想知道這會對性能,系統穩定性等帶來什麼影響。僅供參考,現在我正在使用netMSMQ綁定,因此如果我繼續沿着這條路走下去,會話似乎不是一種選擇。 –

+0

我相信'ClientBase'已經實現了Thilak通過'共享'的含義。它基本上緩存了一個ChannelFactory,所以當你用'新Client'時它將重用現有的無故障客戶端(幕後緩存) –

-1

我認爲你應該使用一個SQL數據庫,你應該登錄的女巫,因爲如果你登錄一個控制檯應用程序,你不能在2天之前看到檢查的東西。而在SQL中,你可以做一個報價並獲得正確的數據你需要。 另一個解決方案是使用log4net項目。

+0

我們已經在使用平面文件跟蹤監聽器,並且可能會添加一個SQL跟蹤監聽器以及。除了其他跟蹤偵聽器之外,我還添加了這個功能,以便我可以實時查看日誌數據。 –

相關問題