Log4j RollingFileAppender の通常の動作は、最初のログ メッセージが別の日に発生したときにロールすることですが、何も起こらなかったとしても、日付ごとに空のログ ファイルが表示されると、暖かく曖昧に感じる人もいます。ログにダミーメッセージを書き込まずに、真夜中過ぎに強制的にロールする方法はありますか?
5443 次
1 に答える
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;
}
于 2010-11-03T01:02:16.313 に答える