2012-04-07 2 views
4

私は埋め込まれたJettyを使用して、Java Webサービスアプリのロギングにlogbackを使用しています。ログはlogback.xmlファイルに基づいて予期したとおりに動作しますが、Javaで生成されたいくつかのログを除き、すべてjsvcの出力にstderrに表示されます。jsvc stderrの出力に表示されるJavaログのログ形式を制御できますか?

ミリ秒のタイムスタンプを持つJavaで生成されたすべてのログが他のログと一致することを特に確認したいと思います。また、jsvc stderrの出力に表示されるものは2番目のものまでしかありません。

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

答えて

2

ソリューションはいくつかの場所で変更が必要で、主にslf4j設定の問題でした。私のアプリケーションには多くの依存関係があり、さまざまなログ実装が導入されています。 Slf4jはすべて一緒に集められるように設計されています。プロセスはしばしばjarファイルを簡単にドロップインしますが、java.util.loggingはもう少し時間がかかります。

slf4j Bridging Legacy APIsページでは、Jerseyによって導入されたJUL依存関係を(ほとんど)どのように結びつけるかについて説明しています。 jul-to-slf4j.jarはすでに含まれていましたが、正しく配線されていませんでした。私はSLF4JBridgeHandler.install()私のアプリの初期化で実行する必要がありました。また、負のパフォーマンスへの影響についてのページの注意私も、私のlogback.xmlで次のファイルが含まれない限り:

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

私が道のほとんどを得たが、ログevents-- 1の重複を紹介しに行ってきましたslf4jと他方は引き続きstderrになりました。 GoogleはClaus Neilsenのブログ「Bridging java.util.logging to 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(); 

をlogbackによって指示されるように、私のjsvcの標準エラー出力に現れてたジャージーログは今、きれいにフォーマット、私の丸太の残りの部分と現れています.xml。

1

私が理解しているように、jsvcはJavaアプリケーションを管理するCで書かれたデーモンです。 Java自体では実際に動作していません。ログのログはstdoutstderrに限られています。 jsvcの出力をnamed pipesにリダイレクトし、何らかのプロセスでそれらを読み取り、ミリ秒のタイムスタンプを与えることができます。ソリューションにどれくらいの労力をかけたいのか。

+0

あなたはjsvcが何であるか正確に理解しています。問題のエラーメッセージは、自分のアプリケーションからJerseyによって生成され、stderrに送信されます。私はjsvcがstderrをキャッチし、その出力をファイルに出力していると思います。私は、jsvcに達する前にstderrのログ出力をインターセプトするソリューションを探しています。 – phatfingers

+0

私は、Java内から生成されたログデータが、jsvc stderrの出力に表示されていることを私の懸念事項としてより明確に反映するように質問を更新しました。 – phatfingers

+1

@phatfingers、logback.xmlはどこに置いていますか? WebappのWEB-INF/classesフォルダにある場合、Jerseyは独自のログには使用しないことは明らかです。 logging.xml [グローバルクラスパスに入れる](http://logback.qos.ch/faq.html#configFileLocation)を入力して、デフォルトのロギングを設定する必要があります。 –

0

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

だから、あなたもそのクラスやレベルによって、フィルタ、または迂回(またはコピー)System.outから独自のファイルに行をログに記録するようにLogManagerを設定するJava Logging guideを参照する必要があります。

独自のコードslf4jを使用する場合は、ConsoleAppenderFileAppenderに置き換えるようにログバックを設定する必要があります。

+0

私は、ログ出力をslf4jを使ってlogbackにバインドします。問題のデータが標準エラー出力に表示されています。 – phatfingers

+1

Javaプロセスからすべてのログ行を管理したいと言うと、ジャージー出力があるので、slf4j/logbackでコードを所有しているので、2つのタスクがあります。 –

+0

ログバックXML設定を提供してください。おそらく問題があります。 –