ログの実装を意識せずに、開発を進めることができる。ログの実装自体はLog4JやSDK1.4のloggingなどが使える。
便利なのか?
Log4jやJDKのLoggerをそのまま使うのであれば、切り替えが簡単なので便利だと思う。ただ、Loggerをプロジェクト向きにカスタマイズした場合、commons-loggingでカバーできない部分も出てくる気がする。
まず、ログの実装を意識せず開発を進めてみる。最終的にLog4jやJDK1.4のloggingを切り替えてみる。
http://jakarta.apache.org/commons/logging/
LogFactoryImplの起動処理
commons-loggingのLogFactoryImplクラスが、どのログ実装クラスを使うかを判定している。この判定方法は以下の通り。
- org.apache.commons.logging.Logという属性名をもったpropertyファイルを探す
- org.apache.commons.logging.Logというシステムプロパティを探す
- Log4Jが使えたらorg.apache.commons.logging.impl.Log4JLoggerというインスタンスを使う。ライブラリにLog4jのJarが入っているかをみているぽい
- JDK1.4以降だったらorg.apache.commons.logging.impl.Jdk14Loggerというインスタンスを使う
- その他だとorg.apache.commons.logging.impl.SimpleLogというインスタンスを使う
システムプロパティとはjavaコマンドなどで与えた引数のこと。
-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
http://jakarta.apache.org/commons/logging/commons-logging-1.1/apidocs/index.html
Loggerの実装を考えずに書いてみる
Loggerを決めずに書くと、実行してもログが出ない。
Log log = LogFactory.getLog(CommonsLoggingTest.class.getName());
log.debug("デバッグログ");
これはJDK1.4のloggingが使われるのだが、「CommonsLoggingTest」はcom.daipresents…というパッケージなので、その設定が「JAVA_HOME\jre\lib\logging.properties」にないからログが出力されない。
logging.propertiesに以下の設定を追加するとログが出力された。
java.util.logging.ConsoleHandler.level = ALL
com.daipresents.level=ALL
Log4jを使ってみる
libフォルダにLog4jのライブラリを入れて、クラスパスの通った場所にlog4j.xmlをおくと、log4jを使ってログ出力してくれる。
JDK1.4のloggingを使ってみる
クラスパスの通った場所にcommons-logging.propertiesを置く。その中で以下のように指定すれば1.4のloggingが使われる。
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
これをしなくても、Log4jのJarがなくて、JDK1.4以上をつかっていれば勝手に使われる。