Tomcat6でCommons-Logging/Log4jによるトレースログを有効にする

無事成功したので、簡単な手順をメモ(といってもほぼオンラインドキュメントのままだが)

  • Commons-Logging対応のtomcat-juli.jarアーカイブをビルドする
    1. Tomcat6のソースコードバンドルをダウンロードして展開する
    2. 上で展開した中にあるextras.xmlのターゲット"commons-logging"をAntでビルドする
    3. ビルドが成功すると以下のjarアーカイブが作成されるので確認する
  output/extras/tomcat-juli.jar
  output/extras/tomcat-juli-adapters.jar
  • Tomcat6の該当jarアーカイブを上で作ったアーカイブで置き換える
    1. $CATALINA_HOME/bin/tomcat-juli.jarをoutput/extras/tomcat-juli.jarで置き換える
    2. $CATALINA_HOME/lib/にoutput/extras/tomcat-juli-adapters.jarを配置する
  • Log4Jとその設定を用意する
    1. Log4jからv1.2以降のアーカイブをダウンロードして$CATALINA_HOME/libに配置するか、log4j.jarにクラスパスを通す
    2. 以下の様にシンプルなlog4j.propertiesを$CATALINA_HOME/libに配置するか
 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との衝突を避けたのだろうか。