web-dev-qa-db-ja.com

Log4jのフォーマット:スタックトレースを切り捨てることは可能ですか?

プログラムの例外の最初の数行のみをログに記録したい。スタックトレースの最初の5行だけを出力するために、次のようなことを実行できます。

Throwable e = ...;
StackTraceElement[] stack = e.getStackTrace();
int maxLines = (stack.length > 4) ? 5 : stack.length;
for (int n = 0; n < maxLines; n++) {
    System.err.println(stack[n].toString());
}

しかし、ロギングには、むしろlog4j(または、より正確には、log4jよりもslf4j)を使用します。スタックトレースの最初の5行のみを出力するようにlog4jに指示する方法はありますか?

30
rompetroll

Log4jのEnhancedPatternLayoutを使用して、スタックトレースをフォーマットできます。

http://logging.Apache.org/log4j/1.2/apidocs/org/Apache/log4j/EnhancedPatternLayout.html 、特にパターンテーブルの「スロー可能な」パターンに関するセクションを参照してください。

%throwable{n}サポートのサポートはかなり新しく、少なくともlog4j 1.2.16(これは執筆時点で最新)が必要であることに注意してください。

追跡の目的で、これはその実装を処理したチケットです: https://issues.Apache.org/bugzilla/show_bug.cgi?id=48902

35
Hendrik

うん... EnhancedPatternLayoutはこの機能を提供します。 (Log4J-1.2.16以降、以前は余分な仲間がいました)。

Log4j構成の場合

<appender name="Console" class="org.Apache.log4j.ConsoleAppender">
    <param name="Threshold" value="debug"/>
    <layout class="org.Apache.log4j.EnhancedPatternLayout">
        <param name="ConversionPattern" value="%d %-5p [%t] %c.%M - %m%n %throwable{short}"/>
    </layout>
</appender>

Javaのようなコードの場合

新しい例外をスローする(新しい例外( "内部例外"));

ログファイルで次のようになります...

Java.lang.Exception:Java.lang.Exception:内部例外

Log4j構成ファイルから '%throwable {short}'を削除すると、完全なスタックトレースが取得されます

10
prav

Log4j2.xmlの最後に%throwable {short}を追加するだけです。パラメータ名を追加する必要はありません。

<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n %throwable{short} %n"/>

ref: https://logging.Apache.org/log4j/2.x/manual/layouts.html#PatternLayout

3
vsingh

私はそのようなオプションを知りません。ただし、現在のアペンダー(RollingFileAppenderなど)を拡張し、append/doAppend/subAppendメソッドを提供できます(拡張するクラスによって異なります)。これを処理します。

スロー可能な情報はLoggingEvent.throwableInformationに含まれています

とはいえ、これを行う必要があるかどうかはわかりません。重要な情報が失われる可能性があります。

1
Bozho

はい、log4j 1.2.16以降、log4jの一部です。

%throwableパターンの各アプリケーションがどのように見えるかを詳細に説明するApache課題追跡の最初の提案は次のとおりです。 https://issues.Apache.org/bugzilla/show_bug.cgi?id=48902 #c

1
Kai Sternad