Tomcat6でCommons-Logging/Log4jによるトレースログを有効にする
無事成功したので、簡単な手順をメモ(といってもほぼオンラインドキュメントのままだが)
- Commons-Logging対応のtomcat-juli.jarアーカイブをビルドする
output/extras/tomcat-juli.jar output/extras/tomcat-juli-adapters.jar
- Tomcat6の該当jarアーカイブを上で作ったアーカイブで置き換える
- Log4Jとその設定を用意する
log4j.rootLogger=debug, R log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=${catalina.home}/logs/tomcat.log log4j.appender.R.MaxFileSize=10MB log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n log4j.logger.org.apache.catalina=DEBUG, R
又は、自分達が使っているlog4jの設定ファイルをTomcat起動時のスクリプト中、"-Dlog4j.configuration"システムパラメタで指定する
- Tomcat6を起動する
これで良いはずだ。
肝はextras.xmlによるAntビルドで生成される置換用のtomcat-juli.jarだ。同jar中を覗いてみるとorg.apache.juli.logging.implパッケージにcommons-logging/Log4j向けのクラスが生成されていることが解る。
org/apache/juli/logging/impl/ org/apache/juli/logging/impl/Jdk14Logger.class org/apache/juli/logging/impl/LogFactoryImpl.class org/apache/juli/logging/impl/NoOpLog.class org/apache/juli/logging/impl/SimpleLog$1.class org/apache/juli/logging/impl/SimpleLog.class org/apache/juli/logging/impl/WeakHashtable$1.class org/apache/juli/logging/impl/WeakHashtable$Entry.class org/apache/juli/logging/impl/WeakHashtable$Referenced.class org/apache/juli/logging/impl/WeakHashtable$WeakKey.class org/apache/juli/logging/impl/WeakHashtable.class
なお、以前に「特別なプラグイン無しでコンテナ(Tomcat)をデバッグする」で紹介したようにTomcatの起動スクリプトでLogManagerの指定をしている場合は以下のJULIの指定があると思うが
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="C:\apache-tomcat-6.0.10\conf\logging.properties"
上記のオプションを除去しないとTomcat6の起動時にClassNotFoundExceptionが発生する。
以上で以前のTomcatのように、Log4jを使いつつ全てのカテゴリのデバッグ情報をstdoutに出力できるだろう。それにしてもCommon-Logging/Log4jがデフォルトの実装コードから外されたのはショック。他のプロダクトのloggingとの衝突を避けたのだろうか。