1

スタンドアロンの Java アプリケーションがあります。アプリケーションはいくつかのライブラリを使用しており、maven と「shade」プラグインによって管理され、すべての依存関係を含む 1 つの大きな jar を作成します。キャッチされていない例外をファイルに記録する際に問題があります (アプリケーションは Linux で実行されます)。log4j.properties を構成し、ローリング ファイル アペンダーを追加しました。動作していますが、例外がスローされるたびに、構成されたログ ファイルではなくコンソールに出力されます。基本的に、すべてのINFO +エントリを含むログファイルで終了していますが、例外はありません(キャッチされていません)。

log4j.properties は次のとおりです。

# Root logger option
log4j.rootLogger=INFO, file

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logs/my-app.log
log4j.appender.file.MaxFileSize=100MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

私は以下を使用してアプリケーションを実行しています:

java -jar -Dlog4j.configuration=file:log4j.properties myApp.jar

現在、コンソールアペンダーを使用して問題を回避し、次を使用してアプリケーションを実行しています。

java -jar -Dlog4j.configuration=file:log4j.properties myApp.jar >> logs/my-app.log 2>&1

...しかし、私は本当にローリングファイルアペンダーを使いたいと思っています。

4

3 に答える 3

4

そのような問題の解決策を見つけました。とても簡単です。'main'クラスにDefaultUncaughtExceptionHandlerを追加する必要があります。スニペットは次のとおりです。

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            logger.error("Uncaught exception", e);
        }
    });
于 2013-02-20T09:40:55.173 に答える
0

例外として、e.printStackTrace()ではなくlogger.fatal(e.getStrackTrace())を使用する必要があります。

于 2013-02-20T09:30:49.983 に答える
0

例外がキャッチされない場合、 log4j によってまったくログに記録されません。したがって、リダイレクトは非常に便利だと思います。

(たとえば) kill -3 を介してスレッド スタック トレースをトリガーすると、それが発生し、その結果、 /stderrを常にキャッチして、log4j ファイルとは別のログ ファイルに書き込むことに注意してください。stderrout

同じログ ファイルに書き込む 2 つのプロセスが正しくインターリーブされることを保証できないため、リダイレクトと log4j の両方を同じログ ファイルに記録しません (上記のように)。

于 2013-02-20T09:36:19.293 に答える