Log4j (および Commons Logging) を使用して、エラー メッセージをログに記録します。ここで、致命的なエラーを syslog に出力する追加のログ アペンダーを設定しますが、例外的に長い Java スタック トレースはありません (それらは完全なログ ファイルで引き続き利用可能です)。
これをどのように構成しますか(log4j.xmlを使用)? スタック トレースを無視するフィルタはありますか?
ソースをもう少し読んだ後に編集します。
引き続き PatternLayout をサブクラス化する必要がありますが、オーバーライドするメソッドは ignoresThrowable() です。これは false を返す必要があります。これにより、アペンダーが Throwable を書き込むことができなくなります (レイアウトが既に行っていると想定されます)。
構成でこれを指定する方法はありません。PatternLayout にはハードコーディングされた「true を返す」があります。
私が使用する実際のコードは次のとおりです。
import org.apache.log4j.PatternLayout;
public class NoStackTracePatterLayout extends PatternLayout {
@Override
public boolean ignoresThrowable(){
return false;
}
}
log4j > 1.2.16 を使用する場合は、EnhancedPatternLayoutレイアウトを使用できます。
例 (log4j.properties ファイルを使用) をアペンダーのレイアウトとして定義%throwable{0}
し、変換パターンを追加します。
log4j.appender.XXX.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.XXX.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c:%L - %m%n%throwable{0}
1.2.16 では EnhancedPatternLayout を使用できます
logback-classic (log4j の後継) の「nopex」または「nopeexception」変換ワードは、スタック トレースの出力を無効にします。「nopex」変換語は、残りの変換語と一緒に文書化されています。少し下にスクロールする必要があります。
このトピックについてさらに情報が必要な場合は、logback-user メーリング リストに連絡してください。
これを行うには、カスタム レイアウトを作成する必要がある場合があります (これはそれほど悪いことではありません。PatternLayout をサブクラス化できます)。
ソースコードを変更できる場合は、別のオプションを検討できます。
私のアプリケーションでは、アプリケーションのエントリ ポイント (「main()」など) からの FATAL メッセージのみを常にログに記録します。
したがって、この 1 か所 (複数のアプリケーション エントリ ポイントがある場合は少数) で、「syslog」などの特別なクラスまたは MDC を使用して Log4j ロガーをインスタンス化します。まもなく致命的なエラーをキャッチしたら、通常の方法で (他のログ ファイルなどのために) ログに記録しますが、この新しい「syslog」ロガーで Fatal() メソッドを呼び出して、正確なメッセージのみを表示します。が必要です (例外クラスとメッセージのみで、スタック トレースがないなど)。次に、Log4j を構成して、この「syslog」クラスまたは MDC のみを、SysLog を対象とする新しく構成されたアペンダーに送信します。
タダム!