プログラムの例外の最初の数行のみをログに記録したい。スタックトレースの最初の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に指示する方法はありますか?
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
うん... 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}'を削除すると、完全なスタックトレースが取得されます
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
私はそのようなオプションを知りません。ただし、現在のアペンダー(RollingFileAppender
など)を拡張し、append
/doAppend
/subAppend
メソッドを提供できます(拡張するクラスによって異なります)。これを処理します。
スロー可能な情報はLoggingEvent.throwableInformation
に含まれています
とはいえ、これを行う必要があるかどうかはわかりません。重要な情報が失われる可能性があります。
はい、log4j 1.2.16以降、log4jの一部です。
%throwableパターンの各アプリケーションがどのように見えるかを詳細に説明するApache課題追跡の最初の提案は次のとおりです。 https://issues.Apache.org/bugzilla/show_bug.cgi?id=48902 #c