Apache Commonsのlogging1.1

ログの実装を意識せずに、開発を進めることができる。ログの実装自体は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以上をつかっていれば勝手に使われる。