私が取り組んでいるプロジェクトでログ フレームワークとして Log4j を使用しています。次のような状況があります: Log4j は、ログをログ ファイルに書き込むように構成されています。ある時点で、このログ ファイルは別の宛先にコピーされ、削除されます。ロギング フレームワークは機能し続けますが、ログ ファイルは削除されているため、ログ ファイルに書き込まれません。Log4j にファイルを再作成し、ログをログ ファイルに書き込み続けるように指示する方法はありますか。
よろしく、 ラシッド
私が取り組んでいるプロジェクトでログ フレームワークとして Log4j を使用しています。次のような状況があります: Log4j は、ログをログ ファイルに書き込むように構成されています。ある時点で、このログ ファイルは別の宛先にコピーされ、削除されます。ロギング フレームワークは機能し続けますが、ログ ファイルは削除されているため、ログ ファイルに書き込まれません。Log4j にファイルを再作成し、ログをログ ファイルに書き込み続けるように指示する方法はありますか。
よろしく、 ラシッド
I study the source of log4j and find log4j can't create new log file, it just print the error message to system.err when the log file was deleted
/**
This method determines if there is a sense in attempting to append.
<p>It checks whether there is a set output target and also if
there is a set layout. If these checks fail, then the boolean
value <code>false</code> is returned. */
protected boolean checkEntryConditions() {
if(this.closed) {
LogLog.warn("Not allowed to write to a closed appender.");
return false;
}
if(this.qw == null) {
errorHandler.error("No output stream or file set for the appender named ["+
name+"].");
return false;
}
if(this.layout == null) {
errorHandler.error("No layout set for the appender named ["+ name+"].");
return false;
}
return true;
}
I think there are two workaround
log4j ファイルでこの行を宣言できることを確認してください
log4j.appender.rollingFile.File=D:/myapp/mylog.log
すでに宣言している場合、ログ ファイルは任意に削除または置換できます。次に、プログラムを再実行すると、このパスに新しいログ ファイルが作成されます。
このクラスを試す
package wodong.test;
import java.io.File;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.spi.LoggingEvent;
public class LastFileAppender extends FileAppender {
@Override
public void append(LoggingEvent event) {
checkLogFileExist();
super.append(event);
}
private void checkLogFileExist(){
File logFile = new File(super.fileName);
if (!logFile.exists()) {
try {
logFile.createNewFile();
} catch (IOException e) {
System.out.println("Error while create new log file.");
}
}
}
}
また、log4j構成ファイルを編集します
log4j.appender.R=wodong.test.LastFileAppender
これを試してみてください。現在、Linux マシンを持っていないため、パフォーマンスの問題を解決できるかどうかはわかりません。
package wodong.test;
import java.io.File;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.spi.LoggingEvent;
public class LastFileAppender extends FileAppender {
@Override
public void append(LoggingEvent event) {
checkLogFileExist();
super.append(event);
}
private void checkLogFileExist() {
if (qw == null) {
File logFile = new File(super.fileName);
if (!logFile.exists()) {
try {
logFile.createNewFile();
} catch (IOException e) {
System.out.println("Error while create new log file.");
}
}
}
}
}