Log4j记录阈值

时间:2013-10-29 07:11:49

标签: logging log4j

当前日志记录阈值,全部与日志级别有关(TRACE,DEBUG,INFO,WARN,ERROR和FATAL) 对我来说还不够。在紧急情况下,我有一个从第三方库写入ERROR类别的千兆字节日志。我不想关闭此日志记录,因为我希望看到此问题日志。大多数日志都在不断重复堆栈跟踪。  所以我想要一种能够

的追加者
  • 1)如果重新获得阈值(kb / sec),则跳过日志(我的意思是当我们的时候 写入大量日志 - 我们可以跳过一些)或
  • 2)跳过堆栈跟踪 如果在一段时间内打印了多于一个(n)堆栈跟踪,则打印

请建议

2 个答案:

答案 0 :(得分:2)

Log4j没有这样的appender开箱即用。但你可以这样做:

为使用千兆字节数据的第三方库添加appender(“我有一个从第三方库写入ERROR类别的千兆字节日志”)。并配置您的appender,使他们不会使用如此大量的存储空间。

  1. RollingFileAppender进行 将此第三方库appender配置为滚动文件。一段时间后,他们将使用最旧的文件,您只能保留最新的日志。

  2. JDBCAppender 此appender接受存储过程的使用。编写存储过程,以便它可以执行您想要的操作。

  3. 对于您的第一个要求,添加计算列或在存储过程中计算此值并添加到表列。然后控制此值以决定是否需要将此日志行插入数据库。

    对于第二个要求您可以获取异常消息的哈希值(MD5,SHA等)。如果数据库表中存在此哈希值,则可以忽略插入它。或者您可以计算它存在多少并决定如何相应地插入数据库。

    您不需要为此目的使用企业数据库,例如,您可以使用apache derby,然后所有日志都保留在应用程序服务器中。我认为这个JDBCAppender更贴近您的要求。

答案 1 :(得分:1)

我过去曾写过类似的东西(每Y时最多发送一封邮件)。它会给你一个方向。设置者不是强制性的,但它们允许您通过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;
    }

}