3

Current logging threshold that is all about log level(TRACE, DEBUG, INFO, WARN, ERROR and FATAL) is not enough for me. I have a gigabytes of log written from third party libraries into ERROR category in emergency case. I do not want to turn of this logging cause I want to see this problem logs. Most of logs are continuously repeating stack traces. So I want a kind of appender which will

  • 1)Skip logs if threshhold(kb/sec) is reaсhed (I mean when we are writing to much logs - we might skip some) or
  • 2)Skip stacktraces printing if more then one(n) stacktrace was printed in period of time

Please suggest

4

2 回答 2

2

Log4j 没有这种开箱即用的附加程序。但您可以执行以下操作:

为使用千兆字节数据的第三方库添加附加程序(“我有从第三方库写入错误类别的千兆字节日志”)。并配置您的附加程序,使其不使用如此大量的存储空间。

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

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

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

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

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

于 2013-11-13T20:11:12.300 回答
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;
    }

}
于 2013-11-17T08:03:13.837 回答