8

私のlog4j.propertiesがこれに見える場合

# 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.foo, com.foo.Bar, root, およびorg.springframework. 作成されてレベルを継承する特定のクラスではありません (IE com.foo.bar.Baz?
私の目的のために、これらのロガーとそのレベルを表示する管理ページを作成しますが、すべてのロガーではなく、プロパティを介して直接構成されたものだけを表示します。現在、親とは異なるレベルを持つロガーに遭遇するまで、親階層をたどっていますが、構成済みのロガーが階層内にある場合は非表示にし、上位のものと同じレベルを設定できます。

4

1 に答える 1

7

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

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

次に、各ロガーにそのレベルを尋ねることができます。

Level currentLevel = logger.getLevel();

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

唯一の問題は、コードのどこかでsetLevel()ロガーを呼び出すと、null 以外が報告され、リストに表示されることです。これは、レベルが設定された場合にのみ、 log4j がレベルの設定方法を認識しないためです。これら 2 つのケースを区別するには、引き続き parse が必要ですlog4j.properties

また、これは現在ロードされているロガーでのみ機能することに注意してください。したがって、com.foo.Barがロードされていない場合は、 で明示的に言及されていても、リストには表示されませんlog4j.properties。Log4J は、将来作成される可能性のある存在しないロガーを認識しません。繰り返しますが、これには parse が必要ですlog4j.properties

于 2012-10-23T16:33:32.237 に答える