当前日志记录阈值,全部与日志级别有关(TRACE,DEBUG,INFO,WARN,ERROR和FATAL) 对我来说还不够。在紧急情况下,我有一个从第三方库写入ERROR类别的千兆字节日志。我不想关闭此日志记录,因为我希望看到此问题日志。大多数日志都在不断重复堆栈跟踪。 所以我想要一种能够
的追加者请建议
答案 0 :(得分:2)
Log4j没有这样的appender开箱即用。但你可以这样做:
为使用千兆字节数据的第三方库添加appender(“我有一个从第三方库写入ERROR类别的千兆字节日志”)。并配置您的appender,使他们不会使用如此大量的存储空间。
RollingFileAppender进行 将此第三方库appender配置为滚动文件。一段时间后,他们将使用最旧的文件,您只能保留最新的日志。
JDBCAppender 此appender接受存储过程的使用。编写存储过程,以便它可以执行您想要的操作。
对于您的第一个要求,添加计算列或在存储过程中计算此值并添加到表列。然后控制此值以决定是否需要将此日志行插入数据库。
对于第二个要求您可以获取异常消息的哈希值(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;
}
}