1

私の現在のプロジェクトでは、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

コードをステップ実行して、開いているファイルハンドルのリストに注目すると、アペンダーの作成中にファイルハンドルが作成されていることがわかります。アプリケーションが終了すると、ログファイルは存在しません。

何か案は?

4

1 に答える 1

0

結局、問題を引き起こしたのは FileAppend ではなく、ログファイルが存在するフォルダーを削除して再作成したまったく無関係のコードでした。ドー!

次のようなトラブルに役立つヒント: Linux を使用している場合は、strace を使用します。

strace -tt -f -e trace=create,open,close,unlink -o strace.out java -jar yourjar.jar

これにより、作成、オープン、クローズ、または削除されたファイルが表示されます。他にもたくさんのものを含めることができます。その他の通話はこちら

于 2012-07-13T12:39:18.267 に答える