4

埋め込まれたJettyを使用して、JavaWebサービスアプリのロギングにログバックを使用しています。ロギングは、logback.xmlファイルに基づいて期待どおりに機能します... Javaで発生した一部のログを除きますが、stderrへのjsvc出力に表示されます。

特に、ミリ秒のタイムスタンプを持つすべてのJava生成ログを他のログと一致させたいのですが、jsvcstderrの出力に表示されるログは秒単位です。

jsvc stdoutログは主にJerseyから生成され、オブジェクトとして参照されている自分のコードがGuiceに登録されているのがわかります。これにより、ログバックを介して制御できることを期待できます。これらのログがログバックキャッチオールではなくjsvcのstderr出力に表示される原因がわかりません。jsvcを使用するときに、コードまたは構成で同様の問題を解決した人はいますか?

4

3 に答える 3

2

このソリューションでは、いくつかの場所で変更が必要であり、主にslf4j構成の問題でした。私のアプリには多数の依存関係があり、さまざまなロギング実装が導入されています。Slf4jは、それらをすべてまとめて囲い込むように設計されており、プロセスは多くの場合、jarの簡単なドロップインですが、java.util.loggingにはもう少し手間がかかります。

slf4j Bridging Legacy APIページでは、(ほとんどの場合)Jerseyによって導入されたJUL依存関係を接続する方法について説明しています。すでにjul-to-slf4j.jarを含めていましたが、正しく接続されていませんでした。SLF4JBridgeHandler.install()アプリの初期化で実行する必要がありました。さらに、logback.xmlファイルに以下も含めない限り、このページはパフォーマンスへの悪影響について警告しています。

<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
    <resetJUL>true</resetJUL>
</contextListener>

それでほとんどの方法が得られましたが、ログイベントの重複が発生しました。1つはslf4jに移動し、もう1つはstderrを続行しました。Googleは、ClausNeilsenのブログの記事「java.util.loggingをSLF4Jにブリッジする」を紹介してくれました。これには、役立つコードスニペットが含まれていました。

// Jersey uses java.util.logging - bridge to slf4
java.util.logging.Logger rootLogger = LogManager.getLogManager().getLogger("");
Handler[] handlers = rootLogger.getHandlers();
for (int i = 0; i < handlers.length; i++) {
    rootLogger.removeHandler(handlers[i]);
}
SLF4JBridgeHandler.install();

これで、jsvc stderr出力に表示されていたJerseyログが、logback.xmlの指示に従って、適切にフォーマットされた残りのログとともに表示されるようになりました。

于 2012-04-18T17:06:55.890 に答える
1

私が理解しているように、jsvcJavaアプリケーションを管理するCで書かれたデーモンです。Java自体では実際には実行されておらず、とへのロギングが制限されていstdoutますstderrjsvc出力を名前付きパイプにリダイレクトし、いくつかのプロセスにそれらを読み取らせて、ミリ秒のタイムスタンプを与えることができます。ソリューションにどれだけの労力を費やしたいかはあなた次第です。

于 2012-04-17T01:54:51.643 に答える
0

クライアントまたはコンテナのFilterjavadocによると、JerseyはJDK Logging APIを使用してSystem.out、デフォルトでログ行を生成します。

したがって、JavaロギングガイドLogManagerを参照して、クラスまたはレベルでフィルタリングしたり、ログ行をSystem.out独自のファイルに転送(またはコピー)したりするように設定する必要があります。

を使用した独自のコードslf4jでは、ログバックを構成して、をに置き換える必要がありConsoleAppenderますFileAppender

于 2012-04-17T21:50:12.853 に答える