7

このプロジェクトは私に受け継がれているので、よくわかりません。ログ(java.util.logging.Logger)を使用して、2つのログファイルを作成する方法があります。

最初のファイル:fileName.log

2番目のファイル:fileName.log.lck

Linuxで実行するとlsof、これら2つのファイルが開いているように見えます。これらの2つのファイルを閉じるにはどうすればよいですか?

これらのファイルを閉じたい理由は、このメソッドが1日に複数回実行され、数週間後に開いているファイルの数が制限(約1000)に達し、その時点でシステムが機能しなくなるためです。プロセス(ログを記録する「ジョブコントローラー」)を再起動すると、開いているログファイルの数が0になり、再び機能します。

これは、ロギングを行うために行われたことです

private static Logger log = Logger.getLogger(MyClass.class.getPackage().getName());
try{
    log.logp(Level.SEVERE, "com.MyClass", "run", "It failed");
}

これはfinallyブロックのファイルを閉じるために私がやろうとしたことですが、機能しませんでした

finally{
    Handler[] handler =   log.getHandlers();
    for(Handler h: handler){
        h.close();
    }
}
4

2 に答える 2

9

私は単に使用します:

LogManager.getLogManager().reset();

これにより、すべてのログ設定(ログファイルパス、ファイル名パターン、フォーマッターなど)がキャンセルされますが、ロガーの使用は停止され、ロックファイルが閉じられ、ロガーが解放されます。

于 2014-04-09T08:34:59.690 に答える
2

最初の解決策

コードを変更したくない場合は、次のように使用します。java.util.loggingをlog4jに送信するにはどうすればよいですか? java.util.logging.LoggerからSLF4Jを使用してログバックしますか?

log4jまたはlogbackを使用します。どちらにもローリングファイルアペンダー(古いファイルは削除されます)または日付/時刻ファイルアペンダーがあります。

2番目の解決策

ロギングに最適な使用法は、ファイルのローリングです。

String filePattern = " fileName%.log";
int limit = 1000 * 1000; // 1 Mb
int numLogFiles = 3;
FileHandler fh = new FileHandler(filePattern, limit, numLogFiles);

// Add to logger
Logger logger = Logger.getLogger(MyClass.class.getPackage().getName());
logger.addHandler(fh);

グローバルにファイルハンドラーを追加できるかどうかわかりません。

于 2012-10-12T06:59:43.637 に答える