私の現在のプロジェクトでは、log4j.properties で構成されているものとは別に、特定のタスクに独自のログファイルを作成させる必要があります。
動的に作成された FileAppender を rootLogger にアタッチすることで、これを実現しようとしています。
public static void setupAnalysisLogfile(String filename) {
PatternLayout layout
= new PatternLayout("%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %C{1} %x - %m%n");
if(Config.CREATE_SEPERATE_LOG)
{
FileAppender appender;
try {
String path = (Config.LOGFILE_PATH!=null)?Config.LOGFILE_PATH:filename;
appender = new FileAppender(layout,path);
appender.setName("Analysis Appender");
org.apache.log4j.Logger.getLogger("my.package.hierarchy").addAppender(appender);
} catch (IOException e) {
org.apache.log4j.Logger.getLogger(Config.class).warn(
"Failed to create a dedicated log "
+ filename,
e);
}
}
}
null でない場合Config.LOGFILE_PATH
(コマンドライン パラメーターから取得)、すべてが機能します。指定したパスにログファイルが作成されます。
ただし、LOGFILE_PATH is null
ログファイルが作成されていないか、何も書き込まれていない場合。
プログラムを実行すると、次のようになり-Dlog4j.debug
ます。
log4j: setFile called: /home/tbender/.something/bytecode/OMFG_3527961e3fb1134e1d3221c000879a90ff1022b6/bytecode/OMFG-1340994475441.log, true
log4j: setFile ended
コードをステップ実行して、開いているファイルハンドルのリストに注目すると、アペンダーの作成中にファイルハンドルが作成されていることがわかります。アプリケーションが終了すると、ログファイルは存在しません。
何か案は?