2011-12-16 2 views
1

GlassFishの下でJava EEアプリケーションを実行しています。私たちは、これらのlog4jロギングステートメントのソース/原点を検索しますか?

log4j.logger.org.apache.commons.httpclient=WARN 

を沈黙させる試みで、log4j.propertiesを設定しているしかし、それはない

[#|2011-12-16T11:20:27.007-0800|INFO|sun-appserver9.1|javax.enterprise.system.stream.out|_ThreadID=19;_ThreadName=Thread-62;|2011-12-16 11:20:27,007 DEBUG org.apache.commons.httpclient.HttpConnection[Thread-62] - enter HttpConnection.closeSockedAndStreams() 
|#] 

[#|2011-12-16T11:20:32.007-0800|INFO|sun-appserver9.1|javax.enterprise.system.stream.out|_ThreadID=19;_ThreadName=Thread-62;|2011-12-16 11:20:32,007 DEBUG org.apache.commons.httpclient.HttpConnection[Thread-62] - enter HttpConnection.close() 

は、いくつかの最近の変更の後に我々は我々のログ内の文のバリを見始めました作業。どのようにしてこれらのログステートメントのソースまたは起源を見つけることができますか?私が望むと思うのは、このログステートメントを引き起こすためにどのコードが呼び出されているかを示すスタックトレースのようなものです。

多分何かが助けになるでしょうか? http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

さらに重要なことは、これらのステートメントをどのように閉じることができますか?彼らは私たちのログを汚染している。

+0

あなたのプロパティファイルを使用していることを確認しますか?あなたが持っているものは正常な状況下でうまくいくので、確かにそれはそのようには見えません。 –

+0

私は自分のプロパティファイルを使用しているかどうかはわかりません。それがあるかどうかを知るために使うことができる安いテストはありますか? – Freiheit

+0

もう1つの情報で、この文は5秒ごとに定期的にヒットします。 – Freiheit

答えて

0

これに対する解決策は、予想よりもはるかに簡単です。

私はこの引数-Dlog4j.debug=trueをJVMに渡すことができることを知りました。 log4jがどこから設定をロードするかを教えてくれます。

それは次のようになります。私は私のクラスパスにJARは、log4j.propertiesファイル(!ずさん)トレースに設定されたルートロガーを持っていたと一緒にパッケージ化していることが分かっ

log4j: Using URL [jar:file:/C:/Sun/GF2/domains/domain1/applications/j2ee-apps/MyProject/lib/omar.jar!/log4j.properties] for automatic log4j configuration.|#] 
... 
Parsing for [root] with value=[trace, stdout, R].|#] 

+0

ああ、うん...残念なことにデフォルトの選択。少なくともオーバーライドしたり、別の方法で対処することができます。良い発見。 –

+1

ここには、1行のコードを変更する必要のない提案があります。ログを[SLF4J](http://www.slf4j.org/)および[Logback](http://logback.qos.ch/)に変更することを検討してください。彼らはlog4jをした同じ人によって書かれています。 SLF4Jは、他のフレームワークを使用してログ・ステートメントをインターセプトできます。 log4j.jarをlog4j-over-slf4j.jarに置き換えれば、log4jへのすべてのログ呼び出しはSLF4Jを介して選択したロガーにルーティングされます。 Logbackはlog4jによく似ています。 logback.xmlを使ってログバックを設定して、必要なログを記録し、他のロガーの設定について心配する必要はありません。 – Paul

1

の設定に上書きしているクラスパスが明らかに高いので、ロガーをつかんですぐに設定することができます。次のようなものがあります。

import org.apache.log4j.*; 
... 
Logger offendingLogger = Logger.getLogger("org.apache.commons.httpclient.HttpConnection"); 
offendingLogger.setLevel(Level.WARN); 
+0

私はロガーを持っていれば、私の設定を上書きしている可能性があることを知るために何か(おそらくデバッガでは?)できますか? – Freiheit

+0

恐れはありません。 Log4Jはレベルを設定した人や設定を追跡しません。 Glassfishのログステートメントを送るには、log4j **に**与えられた 'log4j.properties'のあなたの紹介がうまくいくかもしれません。 http://blogs.oracle.com/naman/entry/configure_log4j_for_use_inでは、メッセージを分離する方法を提案しています。 –

+0

私は、この呼び出しをアプリケーションのクラスに追加しようとしましたが、動作に変更はありませんでした。これは、log4j.propertiesのように、適切な場所を見つけるという問題です。 – Freiheit

関連する問題