Log4j日志门槛

3

当前的日志级别(TRACE、DEBUG、INFO、WARN、ERROR和FATAL)对我来说不够用。在紧急情况下,我有数GB的第三方库写入到ERROR类别的日志中。我不想关闭这些日志,因为我想看到这些问题日志。大部分日志都是重复的堆栈跟踪。

因此,我需要一种追加器,它可以:

  • 1)如果达到阈值(kb/sec),则跳过日志(当我们写入太多日志时-我们可能会跳过一些);或者
  • 2)如果在一段时间内打印了超过一个(n)的堆栈跟踪,则跳过堆栈跟踪打印。

请建议。

2个回答

2

Log4j没有这样的appender。但您可以执行以下操作:

为使用大量数据的第三方库添加appenders(“我有一个从第三方库写入ERROR类别的Gigabytes日志”)。并配置您的appenders,使它们不使用如此大量的存储。

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

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

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

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

您不需要为这些目的使用企业数据库,例如,您可以使用Apache Derby,然后所有日志都留在应用程序服务器中。我认为这个JDBCAppender更符合您的要求。


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;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接