これで、かなり快適なロギング環境を構築することができました。すごい便利。
事の始まりは、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 にできるので、スゲー便利です。
お疲れさまでした。
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!