2013-10-29 186 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更贴近您的需求。