The Apache Tomcat Servlet/JSP Container

The Apache Tomcat 5.5 Servlet/JSP Container

Apache Logo

Links

User Guide

Reference

Apache Tomcat Development

The Apache Tomcat 5.5 Servlet/JSP Container

Logging in Tomcat

Printer Friendly Version
print-friendly
version
Introduction

Tomcat 5.5 はその内部コード全体で Commons Logging を使っており, java.util.logging や Log4J など,開発者が必要に応じてロギング・コンフィグレーションを選択できるようにしています。 Commons Logging は,特定のロギング実装に依存することなく, さまざまなログ・レベルにわたって階層的にログを行う能力を Tomcat に与えます。

Tomcat 5.5 での重要な変更点として,localhost_log を作るために今までのバージョンにあった <Logger> エレメントは,もはや <Context> の妥当な入れ子エレメントではありません。 そのかわりに,デフォルトの Tomcat コンフィグレーションは java.util.logging を使います。 もしも開発者が Tomcat 内部の詳細なロギング (つまり Tomcat エンジン内部で何が起こっているか) を収集したいならば,下記に詳述するように java.util.logging や log4j などの ロギング・システムを設定します。

log4j

Tomcat 5.5 は,あなたが実行時の例外/スタック・トレースのログとして親しんでいたかもしれない localhost_log を廃止しました。 これらのタイプのエラーはたいていは未捕獲の例外によって投げられますが, なおも開発者にとって価値があります。 それらは今や stdout ログに見つけられます。

もしもあなたが Tomcat のコード内部からの,コンテキストにまたがる詳細なロギングをセットアップ する必要があるならば,単純な log4j コンフィグレーションを使うことができます。 このロギングは,あなたが使うことに選んだログ・レベルによっては非常に冗舌になることに 注意してください。 log4j ロギング・コンフィグレーションは,スタック・トレース・タイプのロギング を生成しないことにも注意してください。 そういったスタック・トレースは上述の stdout に出力されます。

以下のステップにしたがって,Tomcat 内部ロギング出力を tomcat.log という名前のファイルに書くようにセットアップします:

  1. 以下の内容のファイル log4j.properties を作成して common/classes にセーブします。
                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
              
  2. Log4J (v1.2 以降) をダウンロードして log4j jar を $CATALINA_HOME/common/lib に置きます。
  3. Commons Logging をダウンロードして commons-logging.jar (commons-logging-api.jar ではなく) を $CATALINA_HOME/common/lib に log4j jar とともに置きます。
  4. Tomcat をスタートさせます。

この log4j コンフィグレーションは,あなたの Tomcat の logs フォルダに tomcat.log というファイルを最大ファイル・サイズ 10MB かつ 10 個までのバックアップでセットアップします。 DEBUG レベルが指定されていますが,これは Tomcat から最も冗舌な出力を得ます。

ロギングにどのパッケージを含めるかについて,あなたはもっと神経質になれます (し,なるべきです)。 Tomcat 5.5 は Engine 名と Host 名で logger を定義し使用します。 例えば,デフォルトの Catalina localhost ログに対し,これを上記の log4j.properties の末尾に付け加えます。 (角括弧を使う) この命名慣習を log4j の XML ベースの設定ファイルで使うことには 既知の問題がありますから,将来のバージョンの log4j がこの慣習を許すまで, ここに述べたようにプロパティ・ファイルを使うことを推奨します。

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

DEBUG レベルは何メガバイトものログ出力を生成し,Tomcat の起動を遅くすることを警告します。 このレベルは Tomcat 内部操作のデバッグが必要なとき,控えめに使うべきです。

もちろん,あなたの web アプリケーションはそれ自身の log4j コンフィグレーションを使うべきです。 そうすることは上記のコンフィグレーション 矛盾しません。 あなたの web アプリケーションの WEB-INF/classes フォルダに似たような log4j.properties を置き,WEB-INF/lib に log4j1.2.8.jar を置きます [訳注: 別のクラスローダにより別の名前空間にはいります]。 それから,あなたのパッケージ・レベルのロギングを指定します。 これは Commons-Logging を必要と *しない* 基本的な log4j のセットアップです。 詳細なオプションについては log4j documentation にあたってください。 本ページの目的は単なる初期導入ガイドです。

java.util.logging

JDK logging を設定するには JDK 1.4 以降が必要です。 Tomcat 5.5 は JDK 5.0 以降を対象にしていますが,互換パッケージを使って JDK 1.4 で走らせることもできます。

JDK に用意されている java.util.logging のデフォルト実装は,あまりに限定的で有用ではありません。 JDK logging の限界として,設定が VM 単位のため,web アプリケーション単位でのロギングが できない模様です。 したがって Tomcat は,デフォルト設定では,デフォルトの LogManager 実装をその欠点に対処した JULI というコンテナ・フレンドリーな実装に置き換えます。 これは標準の JDK java.util.logging と同じ設定メカニズムを,プログラム的なアプローチであれ, プロパティ・ファイルであれサポートします。 主な違いは,クラスローダ単位のプロパティ・ファイルをセットできることと (これは簡単で再配置しやすい web アプリケーションのコンフィグレーションを可能にします), プロパティ・ファイルがわずかに拡張された構文要素をサポートしていることです。 これはハンドラを定義し logger に割り当てる自由度を増やします。

JULI は Tomcat 5.5 ではデフォルトでイネーブルになっており, 通常のグローバルな java.util.logging コンフィグレーションに加えて, クラスローダ単位のコンフィグレーションをサポートします。 つまり,logging は次のレイヤーで設定できます。

  • JKD の logging.properties ファイルで。 どの JDK を Tomcat が使っているのかを見るために JAVA_HOME 環境変数の設定をチェックします (あるいは JRE かもしれません。バージョン 5.5 から Tomcat を JRE で走らせることができるようになりました)。 ファイルは $JAVA_HOME/jre/lib にあります。 あるいは,システム・プロパティ java.util.logging.config.file を使って別の場所にあるグローバルなコンフィグレーション・ファイルを使うことや, java.util.logging.config.class を使ってプログラム的なコンフィグレーションを使うことができます。
  • logging.properties ファイルを使った各クラスローダで。 つまり,Tomcat コアに対して1本のコンフィグレーションを持つと同時に, web アプリと同じライフサイクルを持つ web アプリごとのコンフィグレーションを持つことができます。

デフォルトの logging.properties は,ログ出力を stdout に向けさせる ConsoleHandler と,FileHandler を指定しています。 ハンドラのログ・レベルの閾値は SEVERE, CONFIG, INFO, WARN, FINE, FINEST または ALL にセットできます。 JDK 添付の logging.properties は INFO にセットされています。 あなたは特定のパッケージを対象にして特定のレベルでログを収集できます。 下記は Tomcat からのデバッグ出力をセットする方法です。 ConsoleHandler のレベルもこの閾値を収集するようにセットする必要がありますから,FINEST または ALL をセットします。 完全な詳細については Sun の java.util.logging ドキュメンテーションを参照してください。

org.apache.catalina.level=FINEST

JULI が使うコンフィグレーションも非常に似ていますが,logger のより柔軟な割当てを可能にするために 少々の拡張を使います。主な違いは:

  • プレフィックスをハンドラ名に付けられます。 1個のクラスから複数のハンドラをインスタンス化できます。 プレフィックスは数字ではじまり,"." で終わる文字列です。 例えば 22foobar. は妥当なプレフィックスです。
  • Java 5.0 と同様,logger は loggerName.handlers プロパティを使ってハンドラのリストを 定義できます。
  • デフォルトでは,ハンドラがあるときは logger はその親へ委譲しません。 これは boolean 値をとる loggerName.useParentHandlers プロパティで logger ごとに変更できます。
  • root logger はそのハンドラを .handlers プロパティで定義できます。
  • システム・プロパティを ${systemPropertyName} ではじまるプロパティ値で置換できます。

common/classes に置くべき logging.properties ファイルの例です:

handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, \
           3manager.org.apache.juli.FileHandler, 4admin.org.apache.juli.FileHandler, \
           java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.

4admin.org.apache.juli.FileHandler.level = FINE
4admin.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4admin.org.apache.juli.FileHandler.prefix = admin.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
   2localhost.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
   3manager.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/admin].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/admin].handlers = \
   4admin.org.apache.juli.FileHandler

# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
#org.apache.catalina.startup.ContextConfig.level = FINE
#org.apache.catalina.startup.HostConfig.level = FINE
#org.apache.catalina.session.ManagerBase.level = FINE
    

servlet-examples web アプリケーションに対し, web アプリケーション内部の WEB-INF/classes に置くべき logging.properties の例です:

handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = servlet-examples.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
      

ハンドラのプロパティ

Tomcat の JULI 実装は完全な機能の logging ライブラリであることを目的とはせず, そういったライブラリへの単純なブリッジにすぎません。 しかし,JULI はそのハンドラを設定するためにいくつかのプロパティを用意しています。 下記に列挙します。

FileHandler
AttributeDescription
directory

ログ・ファイルが書かれるディレクトリ。 Tomcat サーバのアカウントはこのディレクトリへの書き込みパーミッションを持っている必要があります。 このプロパティのデフォルト値は logs です。

prefix

ログ・ファイル名のプレフィックス。 ログ・ファイル名はプレフィックスの後に日付が続きます。 このプロパティのデフォルト値は juli. です。

suffix

ログ・ファイル名のサフィックス。 ログ・ファイル名は日付の後にサフィックスが続きます。 このプロパティのデフォルト値は .log です。

level

このハンドラの閾値レベル。 java.util.logging.Level クラスのどれか1個のレベルでなければなりません。 このプロパティのデフォルト値は ALL です。 指定されたレベルより下のレベルのメッセージはファイルに書かれません。

filter

java.util.logging.Filter インタフェースを実装するクラスの完全修飾名。 JUIL はこのクラスをロードし,メッセージをフィルタするためにハンドラに結びつけます。 デフォルトでは,ハンドラに結びついた Filter はありません。

formatter

java.util.logging.Formatter インタフェースを実装するクラスの完全修飾名。 JULI はこのクラスをロードし,メッセージをフォーマットするためにハンドラに結びつけます。 デフォルトでは,ハンドラに結びついた Formatter はありません。


Copyright © 1999-2006, Apache Software Foundation