Log4j RollingFileAppender的正常行为是在第一条日志消息发生在另一天时滚动,但有些人感到温暖和模糊,每个日期都有空日志文件,即使没有发生任何事情。是否有办法强制它在午夜后滚动而不向日志写入虚拟消息?
答案 0 :(得分:4)
我仔细研究过这段代码 - 简单的回答是'不'。翻转是作为Appender上的doAppend()流的一部分触发的 - 触发它的唯一方法是记录某些内容。
你可以用cron伪造这个:只需要一个cron脚本在明天就像11:58那样触摸文件。这将为您提供您正在寻找的空日志文件行为。
这是实现翻转功能的代码:
void rollOver() throws IOException {
/* Compute filename, but only if datePattern is specified */
if (datePattern == null) {
errorHandler.error("Missing DatePattern option in rollOver().");
return;
}
String datedFilename = fileName+sdf.format(now);
// It is too early to roll over because we are still within the
// bounds of the current interval. Rollover will occur once the
// next interval is reached.
if (scheduledFilename.equals(datedFilename)) {
return;
}
// close current file, and rename it to datedFilename
this.closeFile();
File target = new File(scheduledFilename);
if (target.exists()) {
target.delete();
}
File file = new File(fileName);
boolean result = file.renameTo(target);
if(result) {
LogLog.debug(fileName +" -> "+ scheduledFilename);
} else {
LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
}
try {
// This will also close the file. This is OK since multiple
// close operations are safe.
this.setFile(fileName, false, this.bufferedIO, this.bufferSize);
}
catch(IOException e) {
errorHandler.error("setFile("+fileName+", false) call failed.");
}
scheduledFilename = datedFilename;
}