Log 4 jデバッグ
log 4 jはプロジェクトでよく使用されるログフレームワークであり、使用中にlog 4 jプロファイルの競合に遭遇したり、わけのわからないログ情報を印刷したりすることが多い.このとき、現在の環境で使用されているlog 4 jプロファイルを知りたいか、またはプロセス全体でLog 4 jがどのようなことをしたかを知りたいと思っています.この場合,ログ4 jをデバッグし,log 4 jの内部のログ情報を印刷する必要がある.
しかしログ4 jはログ4 j自体を用いて内部のログ情報を出力することはできない.log 4 jの内部には、log 4 jログを出力するためのログツールであるLogログが用意されています.このクラスはlog 4 jパケットからログ文を出力するために使用されます.
?
ログログのドキュメントの説明から分かるように、システム属性log 4 j.configDebug=trueを設定することでログ4 jを出力するログを開くことができ、log 4 j.configDebug変数は破棄され、現在log 4 j.debugで置き換えられている.
?
上記のコードから分かるように、log 4 jプロファイルをロードする前に、LogLog.DEBUG_を取得するKEY(log 4 j.debug)のシステム属性値(log 4 j.configDebugの値を再判断し、後方互換性のため)は、そのシステム属性に値がある場合はLogLog.setInternalDebugging(OptionConverter.toBoolean(value,true));ログをログ出力するかどうかをログのスイッチdebugEnabledで制御します.以降ログ4 jのログを出力すると、そのスイッチでデバッグ情報を出力する必要があるか否かを判断することができる.
?
出力デバッグログがオンの場合、log 4 jのデバッグログは次のように表示されます.
?
これにより、log 4 jが使用するプロファイルとAppenderのプロパティを簡単に見ることができます.
しかしログ4 jはログ4 j自体を用いて内部のログ情報を出力することはできない.log 4 jの内部には、log 4 jログを出力するためのログツールであるLogログが用意されています.このクラスはlog 4 jパケットからログ文を出力するために使用されます.
?
Log4j components cannot make log4j logging calls. However, it is
sometimes useful
for
the user to learn about what log4j is
doing. You can enable log4j internal logging by defining the
log4j.configDebug variable.
ログログのドキュメントの説明から分かるように、システム属性log 4 j.configDebug=trueを設定することでログ4 jを出力するログを開くことができ、log 4 j.configDebug変数は破棄され、現在log 4 j.debugで置き換えられている.
?
String value = properties.getProperty(LogLog.DEBUG_KEY);
//LogLog.DEBUG_KEY --> log4j.debug
if
(value ==
null
) {
value = properties.getProperty(
"log4j.configDebug"
);
if
(value !=
null
)
LogLog.warn(
"[log4j.configDebug] is deprecated. Use [log4j.debug] instead."
);
}
if
(value !=
null
) {
LogLog.setInternalDebugging(OptionConverter.toBoolean(value,
true
));
}
上記のコードから分かるように、log 4 jプロファイルをロードする前に、LogLog.DEBUG_を取得するKEY(log 4 j.debug)のシステム属性値(log 4 j.configDebugの値を再判断し、後方互換性のため)は、そのシステム属性に値がある場合はLogLog.setInternalDebugging(OptionConverter.toBoolean(value,true));ログをログ出力するかどうかをログのスイッチdebugEnabledで制御します.以降ログ4 jのログを出力すると、そのスイッチでデバッグ情報を出力する必要があるか否かを判断することができる.
?
public
static
void
debug(String msg) {
if
(debugEnabled && !quietMode) {
System.out.println(PREFIX+msg);
}
}
出力デバッグログがオンの場合、log 4 jのデバッグログは次のように表示されます.
?
-Dlog4j.debug=
true
, :
log4j: Trying to find [log4j.xml] using context classloader
sun.misc.Launcher$AppClassLoader
@136228
.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader
@136228
class
loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader
sun.misc.Launcher$AppClassLoader
@136228
.
log4j.properties
log4j: Parsing
for
[root] with value=[WARN, A1].
log4j: Level token is [WARN].
log4j: Category root set to WARN
log4j: Parsing appender named
"A1"
.
log4j: Parsing layout options
for
"A1"
.
log4j: Setting property [conversionPattern] to [%-4r [%t] %-5p %c %x - %m%n].
log4j: End of parsing
for
"A1"
.
log4j: Parsed
"A1"
options.
log4j: Finished configuring.
これにより、log 4 jが使用するプロファイルとAppenderのプロパティを簡単に見ることができます.