tomcat6 のログ出力を Log4j で行う方法

これで、かなり快適なロギング環境を構築することができました。すごい便利。

事の始まりは、tomcat6 のログローテションを自前で行おうとしたことだった。tomcat6 では、デフォルトで日付付きのログファイルを出力するのだけど、それだと自前のローテーション処理とぶつかってしまう。これはどげんかせんといかん、と言うわけで、公式マニュアルを見たら、Log4J を使う方法が書いてあったので、「これだ!」と。

しかし、Log4J の効果はローテーションに留まらず。ログ出力内容の細かなコントロールも可能になったことで、運用上必要なログのみを出力するようにできたり、かなり嬉しいことに。やってて良かった公文式。(違う)

以下、Log4J 導入までの流れ。(ほとんどマニュアルと同じですが)

今回、公式マニュアルのほかに、以下のサイトを参考にしました。

Tomcat 6.0 の標準ログを Log4j に変更 MOYO Laboratory

まず、こちらのサイトにもあるように、tomcat-juli.jar と tomcat-juli-adapters.jar を生成します。ビルド済みの JAR も落とせるようになっているので、そちらを利用するのも可。(ちゃんと動作しました)

生成した jar をそれぞれ既存のものに上書きコピー。

# cp tomcat-juli.jar ${catalina.home}/bin/
# cp tomcat-juli-adapters.jar ${catalina.home}/lib/

続いて、log4j.properties を作成。

# vi ${catalina.home}/conf/log4j.properties

今回はローテーションを別プロセスで行うので、ひたすら catalina.out にログを吐き続けるように設定。ConversionPattern などは好きにやっちゃってください!

log4j.rootLogger=INFO, R
log4j.appender.R=org.apache.log4j.FileAppender
log4j.appender.R.File=${catalina.home}/logs/catalina.out
log4j.appender.R.Append=true
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-5p: %d [%t] %m%n

log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, R log4j.logger.org.apache.catalina.core=INFO, R log4j.logger.org.apache.catalina.session=INFO, R

いま作成した log4j 設定ファイルを読み込むように、catalina.sh を修正。JAVA_OPTS に次の一文を加えます。(パスは各環境に合わせて読んでください)

JAVA_OPTS="$JAVA_OPTS" -Dlog4j.configuration=file:/usr/local/tomcat/conf/log4j.properties

これで完了、と言いたいところなんだけど、このままだと既存のLogging機構も動いてしまう。それだと元々のコンセプトが崩れてしまうので、これまた起動スクリプトをいじります。170行目付近を、以下のようにコメントアウト。

# Set juli LogManager if it is present
#if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then
#  JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties"
#fi

これで起動すると、log4j.properties の設定にしたがって、catalina.out にログがバンバン吐き出されるはずです。起動ログを tail してワクワクすると良いと思います。

今回の例には書きませんでしたが、この対応における一番の恩恵は、カテゴリごとに出力レベルを変更できる Log4J の機構を使えることができたことです。

DEBUG は開発用のログではあるんですが、実は運用フェーズでも、一時的に一部のDEBUGメッセージはログに出力したいなんてこと、あるじゃないですか。Logging だと十把一絡げに level = DEBUG にしないといけないんですが、そうすると余計な DEBUG メッセージも付いてくるわから、ログが肥大化しちゃう...。Log4J では細かな制御ができるので、ログ出力を最小に留めつつ、欲しいところで level = DEBUG にできるので、スゲー便利です。

お疲れさまでした。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/488
PUTRA HEIGHTS HOUSE FOR SALE at 2016年2月14日 07:09

Wow, great blog page composition! Just how prolonged have you ever been blogging for? you made blogs appear effortless. The complete . PUTRA HEIGHTS HOUSE FOR SALEglance of your web site is fantastic, let alone the information fabric!