2011-10-11 36 views
1

我使用企業庫3.1 Msmqdistributor服務來分發來自不同application.I日誌已經定義在categorySources/specialSources多聽衆,但如果一個監聽器失敗比後來的聽衆將永遠不會執行。企業庫3.1 - 如果一個監聽器失敗,則隨後的監聽器將永遠不會被執行

以下是我的配置代碼。

<specialSources> 
     <allEvents switchValue="Warning" name="All Events"> 
     <listeners> 
      <add name="Database Listener A" />   
      <add name="Custom Trace Listener A" /> 
      <add name="Custom Trace Listener B" /> 
     </listeners> 
     </allEvents> 
     <notProcessed switchValue="Warning" name="Unprocessed Category" />   
     <errors switchValue="Warning" name="Logging Errors &amp; Warnings"/>   
</specialSources> 

如果我錯了指定連接字符串數據庫聽者然後將它未能數據庫中插入日誌。但它也將停止下一定義跟蹤監聽器和自定義跟蹤偵聽乙的就業機會。所以了這裏定義跟蹤監聽器和自定義跟蹤監聽器B將被永遠執行,如果數據庫聽者失敗。

有人可以幫忙嗎?

感謝 Mitesh帕特爾

回答

1

這種行爲似乎是 「設計」。請參閱Microsoft Enterprise Library 4.1 Logging Fails on Windows XP SP3的答案。

當然,這並不能真正幫助你。一種解決方法是將一個偵聽器附加到一個類別。所以對於你的3位聽衆,你可以添加3個類別。這將工作,但不是特別優雅。

既然你表明你正在使用2個自定義跟蹤監聽器的另一種方法來緩解這個問題將是編寫自定義跟蹤偵聽吞下任何異常(通常不是一個好主意,雖然)。你也可以讓你的跟蹤監聽器最不可能失敗。例如。數據庫>事件日誌>平面文件。在您的方案中,將自定義跟蹤偵聽器放置在數據庫跟蹤偵聽器之前。

這也是很好的做法,以跟蹤偵聽器添加到錯誤類別。不知道你的應用是否有這個功能(但是發佈的配置沒有)。

+0

嗨Tuzo,感謝您的及時回覆。但在我目前的需求中,我想要抑制Listener中的任何異常,並繼續後續的Listener。我無法吞下Database Listener中的異常,因爲它是內置偵聽器。另外,我可以在中爲任何異常指定監聽者,但在這裏也是相同的情況。 – mit

+0

@ user988917:是的,我知道你不能在數據庫偵聽器中隱藏;這就是爲什麼我建議把它放到最後。你可以從EL源創建你自己的數據庫監聽器,然後不要扔到那裏。當然,你可能會想要捕獲和記錄故障,所以你知道有問題。 –

+1

再次感謝Tuzo。但是我希望所有的聽衆,如果有任何錯誤,它會被壓制。我已經有了通過繼承LogSource和LogWriter的基類來實現它的解決方案 – mit