2010-03-09 46 views
11

我們使用SMTP將我們的log4net與Jira橋接起來。防止log4net通過SMTP發送重複問題

現在我們擔心,由於該網站是公開的,如果我們在生產環境中遇到大量問題,Jira服務器可能會發生什麼情況。

我們已經在Critical和Fatal上進行過濾,但我們希望看到log4net上的一些累加器服務或標識重複問題並阻止它們通過電子郵件發送的普通過濾器。最好不必更改錯誤報告代碼,所以配置解決方案將是最好的。

我想把日誌轉儲到數據庫然後創建一個單獨的偵聽器一些智能代碼將是一個(pricy)的選擇。

回答

14

也許this足以滿足您的要求:

它基本上限制了在給定的時間跨度發送的電子郵件數量。我認爲應該很容易根據您的需求進行定製。我做了類似的事情,即使是在一定時間範圍內丟棄消息:

public class SmtpThrottlingAppender : SmtpAppender 
{ 
    private DateTime lastFlush = DateTime.MinValue; 
    private TimeSpan flushInterval = new TimeSpan(0, 5, 0); 

    public TimeSpan FlushInterval 
    { 
     get { return this.flushInterval; } 
     set { this.flushInterval = value; } 
    } 

    protected override void SendBuffer(LoggingEvent[] events) 
    { 
     if (DateTime.Now - this.lastFlush > this.flushInterval) 
     { 
      base.SendBuffer(events); 
      this.lastFlush = DateTime.Now; 
     } 
    } 
} 

的刷新間隔可以配置像其他追加程序的正常設置:

<flushInterval value="01:00:00" /> 
+0

這真棒 – Hans 2013-01-23 18:19:39

+0

不知道我是否理解,但是會等待,然後一次發送一堆電子郵件,還是發送一封包含所有事件的電子郵件? 'base.SendBuffer(events)'做了什麼?由於OP也要求「_a簡單的過濾器來標識重複的問題並阻止它們被髮送」,那麼在調用'base.SendBuffer(events)'之前,可以通過從'events'數組中刪除項來完成。這是正確的嗎? – Ben 2013-11-17 15:03:30

+0

它發送一個電子郵件與所有事件。如果你需要,你可以在調用'base.SendBuffer()'之前從數組中刪除某些事件。 – 2013-11-18 08:51:16

4

您也可以使用平原SmtpAppender與log4net.Core.TimeEvaluator作爲評估者。

假設我們有5分鐘的時間間隔,以及00:00,00:01和01:00的事件。

  • Stefan Egli的SmtpThrottlingAppender將在00:00(活動1)和01:00(活動2和3)發送電子郵件。
  • 帶TimeEvaluator的SmtpAppender將在00:05(事件1和2)和01:05(事件3)發送電子郵件。

你想要哪一個取決於你是否被保證延遲或潛在的大延遲困擾。

我試圖將SmptThrottlingAppender與TimeEvaluator組合起來,但無法獲得我想要的行爲。我開始懷疑我應該寫一個新的ITriggeringEventEvaluator,而不是一個新的IAppender。

+1

閱讀TimeEvaluator源代碼http://svn.apache.org/viewvc/logging/log4net/trunk/src/Core/TimeEvaluator.cs?我的理解是,TimeEvaluator將在00:00(事件1)觸發發送,而不是在00:01觸發(因爲自上次觸發以來還沒有過去5分鐘),然後再次觸發01 :00(事件2和3取決於緩衝區大小等) – 2012-11-15 10:47:05

+0

更確切地說,如果TimeEvaluator在00:00創建,那麼它不會在00:00 00:00 – irriss 2016-06-17 03:40:09