log4j动态生成日志文件
log4j在第一次加载的时候会生成需要记录的日志文件,这个生成的日志文件如果不小心删除了,那么log4j将不会再重新创建一个新的文件,导致日志数据信息流失。这时就需要解决在日志文件删除的情况下,如何动态的自动生成日志文件呢。
查看源码,我们会发现log4j在记录日志的时候会有一个记录策略。
public boolean isTriggeringEvent(LogEvent event) {
boolean triggered = this.manager.getFileSize() > this.maxFileSize;
if (triggered) {
this.manager.getPatternProcessor().updateTime();
}
return triggered;
}
即在准备将数据写入日志的时候会调用这个方法。因此我们在这里加入判断是否文件存在的方法即可,如果文件不存在就创建一个新的文件,这里调用它的rollover方法重新创建文件。
public synchronized void rollover() {
if (this.hasOutputStream()) {
if (this.rollover(this.rolloverStrategy)) {
try {
this.size = 0L;
this.initialTime = System.currentTimeMillis();
this.createFileAfterRollover();
} catch (IOException var2) {
this.logError("Failed to create file after rollover", var2);
}
}
}
}
因此将isTriggeringEvent进行修改方案如下:
public boolean isTriggeringEvent(LogEvent event)
{
File file = new File(this.manager.getFileName());
if (!file.exists()) {
this.manager.rollover();
}
boolean triggered = this.manager.getFileSize() > this.maxFileSize;
if (triggered) {
this.manager.getPatternProcessor().updateTime();
}
return triggered;
}
这里使用的是直接在源码里面修改,所以需要先下载log4j-core的源码包,修改后编译替换log4j-core.jar里面的class文件。重新发布到项目。经过鄙人测试,在删除了日志文件后,当有新的日志生成时会动态生成新的日志文件。
修改前:
删除所有日志:
通过相关操作重新触发日志生成:
log4j动态生成日志jar包:
log4j-core-2.12.0.jar