2013-10-29 190 views
3

當前日誌記錄閾值是所有關於日誌級別(TRACE,DEBUG,INFO,WARN,ERROR和FATAL) 對我來說是不夠的。在緊急情況下,我有從第三方庫寫入的千兆字節的日誌到ERROR類別。我不想關閉此日誌記錄原因,我想查看此問題日誌。大多數日誌不斷重複堆棧跟蹤。 所以我想一種附加器,如果門限(KB /秒)的reaсhed將Log4j日誌記錄閾值

  • 1)跳過日誌(我的意思是,當我們 書面多少日誌 - 我們可能會跳過一些)或
  • 2)跳過蹤跡 打印如果多於一個(n)的堆棧跟蹤在時間週期
  • 印刷

請提出

回答

1

我以前寫過類似的東西(每Y次發送X個郵件)。它會給你一個方向。制定者不是強制性的,但他們允許您通過log4j.properties更改默認值。

public class LimitedSMTPAppender extends SMTPAppender { 

    private int limit = 10;   // max at 10 mails ... 
    private int cycleSeconds = 3600; // ... per hour 

    public void setLimit(int limit) { 
     this.limit = limit; 
    } 

    public void setCycleSeconds(int cycleSeconds) { 
     this.cycleSeconds = cycleSeconds; 
    } 

    private int lastVisited; 
    private long lastCycle; 

    protected boolean checkEntryConditions() { 
     final long now = System.currentTimeMillis(); 
     final long thisCycle = now - (now % (1000L*cycleSeconds)); 
     if (lastCycle!=thisCycle) { 
      lastCycle = thisCycle; 
      lastVisited = 0; 
     } 
     lastVisited++; 
     return super.checkEntryConditions() && lastVisited<=limit; 
    } 

} 
2

Log4j的沒有這樣一個appender出框。但你可以這樣做:

爲使用千兆字節數據的第三方庫(「我有從第三方庫寫入的千兆字節到錯誤類別」)添加appender。並配置你的appender,使他們不使用如此大量的存儲。

  1. RollingFileAppender進行 配置這個第三方庫的appender作爲滾動文件。一段時間後,他們將使用最舊的文件,並且只能保留最新的日誌。

  2. JDBCAppender 此appender接受使用存儲過程。編寫一個存儲過程,以便它可以做你想做的事。

對於您的第一個要求,請在存儲過程中添加一個計算列或計算該值並將其添加到您的表格列中。然後控制此值以決定是否需要將此日誌行插入數據庫。

您的第二個要求您可以採取異常消息的散列值(MD5,SHA等)。如果這個散列值存在於數據庫表中,你可以忽略插入它。或者你可以統計它存在多少,並決定如何相應地插入數據庫。

您不需要爲這些目的使用企業數據庫,您可以使用apache derby,然後將所有日誌保留在應用程序服務器中。我認爲這個JDBCAppender更貼近您的需求。