2012-08-23 10 views
5

私のlog4j.propertiesの場合は、このlog4jで別個のロガーを取得する方法は?

# General configuration 
log4j.rootLogger = ERROR, ConsoleAppender 

# Appender configuration 
log4j.appender.ConsoleAppender = org.apache.log4j.ConsoleAppender 
log4j.appender.ConsoleAppender.layout = org.apache.log4j.PatternLayout 
log4j.appender.ConsoleAppender.layout.ConversionPattern = %5p (%c) %m%n 
#Other Loggers 
log4j.logger.com.foo=INFO 
log4j.logger.com.foo.Bar=DEBUG 
log4j.logger.org.springframework=INFO 

がちょうどロガーcom.foocom.foo.Barroot、およびorg.springframeworkを取得する簡単な方法はありそうです。作成され、レベルを継承している特定のクラスではありません(IE com.foo.bar.Baz
私の目的として、これらのロガーとレベルを表示する管理ページを作成したいが、すべてのロガーではなく、現在、私は親と異なるレベルを持つロガーに出くわすまで親階層を走査していますが、それらが階層にあり、より高いものと同じレベルを設定していれば設定されたロガーを隠すことができます。

+1

質問からプロパティファイルを解析していますか? –

+0

いいえ、log4jをプログラムで使用して、どのロガーが構成されているかを検出し、他のロガーから継承するだけではありません。 – Kodi

答えて

4

あなたはこのような何かを行うことができます。まず、ログマネージャからすべてのロガーを取得:。

Enumeration<Category> loggers = LogManager.getCurrentLoggers(); 

そして、あなたはそのレベルのために、各ロガーを求めることができます:それは明示的に設定されていない場合

Level currentLevel = logger.getLevel(); 

currentLevelnullになります。したがって、ロガーがlog4j.propertiesの特定のレベルに設定されている場合は、null以外の値が取得されます。それ以外の場合はnullという値が得られます。ルートロガーは常にレベルを報告するので、特殊なケースになります。このようにして、log4j.propertiesファイルを解析する必要はありません。

唯一の問題は、コードのどこかでロガーでsetLevel()を呼び出すと、ヌル以外を報告してリストに表示されるという唯一の問題です。これは、log4jがレベルが設定されたの方法が全く設定されていない場合にのみ設定されているためです。これらの2つのケースを区別するためには、まだlog4j.propertiesを解析する必要があります。

また、現在ロードされているロガーでのみ機能することに注意してください。したがって、com.foo.Barが一度もロードされなかった場合、明示的にはlog4j.propertiesに記載されていても、リストには表示されません。 Log4Jは、今後作成される可能性のある既存のロガーについては認識していません。ここでも、log4j.propertiesを解析する必要があります。

+4

LogManagerにはgetCurrentLoggers()はありません。 Log4j 2.2。 –

+1

@MagnoCそうです、私の答えは[Log4J v1](https://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/LogManager.html)です。 Log4J v2は、回答時(2014年リリース)にはまだ2年間離れていました。 –

+0

Log4J JARをもう一度追加する必要があります。Log4Jを独自のLoggerクラスにラップする必要があります(Log4J JARを削除し、同じ名前のクラスを作成する必要がある名前を保持するため)。だから、私は自分のLoggerクラス内から実際のロガーを呼び出す(完全なクラス名を使用する)。今度は私のロガーを有効にして無効にすることができます。無効にすると、私は実際のログを通してログ文字列を渡すだけではありません。 –