logのレベル設定方法

StrutsなりHibernateなりいろいろなライブラリがjakarta-commons-loggingに対応しています*1。commons-loggingは使用する下位のロギングAPIが何であっても共通的にログが取れます。


これはこれでいいのですが、いかんせん、commons-loggingはログレベルの設定機能をサポートしていません。ログの量・詳しさが、多すぎる、とか、少なすぎる、と言う時に、設定ファイルを書き換えてログのレベルを設定する方法は、ロギングAPIの方法によってまちまちで、結構わかりずらく、初めて使うときには混乱してしまいます。


commons-logは設定がないときには、使えるログAPIが何があるか自動的に探します*2。commons-loggingはLog4jと相性がいいようなので、ここではまずLog4jが使えるようになっている(CLASSPATH内にlog4j.jarがある)事を前提に設定して見ます。


Log4jの場合の設定

CLASSPATHには、、、

commons-logging-xxx.jar
log4j-xxx.jar

プロパティファイルの置き場所には、、、

log4j.properties
もしくは
commons-logging.properties

を用意します。


実際のログレベルの設定は、log4j.properties の中に、、、

log4j.rootCategory=XXXX, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target = System.out
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d  %C : %m %n

と書きます。

この一行目のXXXXの部分がディフォールトのログレベルの設定で、commons-loggingの設定と同じく、DEBUG, INFO, WARN, ERROR, FATALの5つが使えます。


ログレベルを特定のパッケージにのみ設定したい場合には、、、

log4j.category.net.sf.hibernate=DEBUG

のように、頭に「log4j.category.」を付けてパッケージ名を指定すれば、それ以下のパッケージ(上の例では「net.sf.hibernate」)のログレベルだけを設定できます。


JDK1.4ロギングの場合の設定

JDK1.4に標準で含まれているロギングAPI(パッケージ java.util.logging)は、少々Log4jよりは使いづらそうです。(
http://www.ingrid.org/jajakarta/log4j/jakarta-log4j-1.1.3/docs-ja/critique.html )


CLASSPATHにはcommons-logging-xxx.jarだけがあればいいですが、設定ファイルはJavaシステム全体の物を使います。(注:他の方法を見つけられなかった。FIXME)。設定ファイルは、Javaシステムディレクトリ内の、jre/lib/logging.properties ファイルを使用します。


設定は以下の2点を変更します。

#.level= INFO
.level= ALL
                                                                                              • -
#java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.level = ALL

上の物は、標準のログレベルを設定します。下の方は、設定されているコンソール用のConsoleHandlerが、標準ではINFO以上のログをフィルターしているのを変更しています。


設定できるログレベルは、commons-loggingのものとは少々異なり、SEVERE(=OFF)、WARNING、INFO、CONFIG、FINE、FINER、FINEST(=ALL)の7つが設定できます。


ログレベルを特定のパッケージにのみ設定したい場合には、同じくjre/lib/logging.properties ファイルの一番最後に、「パッケージ名+.level」と言うプロパティを設定します、、

net.sf.hibernate.level = ALL

とすると、「net.sf.hibernate」以下のパッケージのログレベルを「ALL」に設定できます。


メモ: commons-logのログAPI検索方法

commons-logは以下の順序でログ先を検索するようです。

1: 設定ファイル

まず、設定ファイルにorg.apache.commons.logging.Logがあればそこに指定してある物を使います。

2: システム・プロパティ

次に、システム・プロパティにorg.apache.commons.logging.Logがあればそこに指定してある物を使います。

3: Log4j

そして、log4j.jarがCLASSPATHにあればLog4jを使います。(今回の説明はこれを使っています。)

4: JDK 1.4

次に、JDK 1.4以上の場合には標準のJDKログを使います。

5: SimpleLog

最後に見つからないときには内臓のSimpleLogを使います。

*1:本当は結構commons-loggingに対応していないライブラリも多かったりする。例えばVelocityはAvalonLogKitとlog4jにしか対応していない。JavaのログAPIはちょっと混乱している。どれか1つ選ぶならLog4jだろうか、、、

*2:上のメモ「commons-logのログAPI検索方法」参照