Logging in Tomcat

Important note

デフォルトでは、java.util.loggingだけがtomcatで利用されています。
Tomcatのログ出力はhardcodedされており、ログ出力モジュールを入れ替えることによりほかのログ出力に入れ替えることができます。
代わりのコンポーネントをビルドするか、ダウンロードするかによって、ログ出力モジュールを埋め込むことができ、使用可能となります。
extras componetsのドキュメントを参照してください。
それらに、詳細なログモジュールの埋め込みに関する記述がされています。

Introduction

Tomcat6.0ではCommons Logingを内部的なコードで使用していますが、
開発者が必要とするたとえばlog4jのようなログモジュールを使用することもできます。
Commons LoggingはTomcatに階層構造をもったログ出力とログレベル設定を行う能力を提供します。
特定の出力に依存したコードを記述する必要はありません。

Tomcat6.0と5.0との大きな違いとして<Context>タグの要素としての<Logger>タグが使用できなくなりました。
代わりに、デフォルトのtomcatのログ出力設定はjava.util.loggingになりました。
もし、開発者がTomcatの内部的に出力しているログを見たい場合は、以下に説明するようにjava.util.logging もしくはLog4jの設定を行えばよい。

log4j

Tomcat6.0はアプリケーションから出力される実行時例外/スタックトレースログに関連するlogをlocalhost_logとして出力しています。
これらのタイプの例外は、通常捕捉されなかった例外によって発生しますが、開発者にはとっては有益なものです。
それらはstdoutログでそれらを見つけることができます。

Tomcatのコードから関連する詳細なログ出力をセットアップする必要があるなら、あなたは簡単なlog4j構成を使うことができます。
あなたが選んだログレベルによって、このログ出力が非常に冗長である場合があることに注意してください。
また、log4jログ出力構成がスタックトレースタイプログ出力を起こさないだろうことに注意してください:
それらのスタックトレースは、上で議論するように、stdoutへの出力です。


以下のステップに従って、Tomcat内部のログを出力をtomcat.logというファイルに出力するしてみましょう。

1. 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


2.Log4Jをダウンロード(V1.2以降のもの)を行い、$CATALINA_HOME/lib の中に配置
3.ビルドするか、ダウンロードした追加ログパッケージを準備する
(詳細はextras components documentaitonを参照すること)
4.$CATALINA_HOME/bin/tomcat-juli.jarを3で準備したtomcat-juli.jarと入れ替える。
5.3で準備したtomcat-juli-adapters.jar を $CATALINA_HOME/libに配置する
6.Tomcatを起動

この設定では、tomcat.logのサイズが10MBになればローテートを行い10個のバックアップを取るという設定になっています。ログの出力レベルはDEBUGで、tomcatのログとしては一番
詳細な出力となります。

パッケージ単位でもっと限定的にログの設定を行うこともできます。
Tomcat6はEngineとHost名でログ出力を定義しています。
たとえば、デフォルトのCatalina localhost logの場合以下のようにlog4.propertiesに追記してください。
XMLベースのlog4jの場合、[]シカクカッコを使っての名前変換の問題がありますので、
log4Jの将来バージョンにてこの問題が解決するまでは、properties file形式の記述をお勧めします。

 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 Applicationに関しては各自のlog4jの設定を行うべきです。
そして、その設定はそのApplicationのみに有効な設定となります。
ここで説明されているようにlog4j.propertiesを設定してそのapplicationのWEB-INF/classesに配置し、log4jのjarをWEB-INF/libに配置してください。
そうすれば、指定されたパッケージはレベル分けして出力されるでしょう。
log4jに関しての基本的な設定に関してしか記述していません、詳細なオプションに関してはlog4jのドキュメントを参照してください。このページは、きっかけをガイドしているのみです。

以下、未訳

java.util.logging
The default implemenatation of java.util.logging provided in the JDK is too limited to be useful. A limitation of JDK Logging appears to be the inability to have per-web application logging, as the configuration is per-VM. As a result, Tomcat will, in the default configuration, replace the default LogManager implementation with a container friendly implementation called JULI, which addresses these shortcomings. It supports the same configuration mechanisms as the standard JDK java.util.logging, using either a programmatic approach, or properties files. The main difference is that per-classloader properties files can be set (which enables easy redeployment friendly webapp configuration), and the properties files support slightly extended constructs which allows more freedom for defining handlers and assigning them to loggers.

JULI is enabled by default in Tomcat 6.0, and supports per classloader configuration, in addition to the regular global java.util.logging configuration. This means that logging can be configured at the following layers:

In the JDK's logging.properties file. Check your JAVA_HOME environment setting to see which JDK Tomcat is using. The file will be in $JAVA_HOME/jre/lib. Alternately, it can also use a global configuration file located elsewhere by using the system property java.util.logging.config.file, or programmatic configuration using java.util.logging.config.class.
In each classloader using a logging.properties file. This means that it is possible to have a configuration for the Tomcat core, as well as separate configurations for each webapps which will have the same lifecycle as the webapps.

The default logging.properties specifies a ConsoleHandler for routing logging to stdout and also a FileHandler. A handler's log level threshold can be set using SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST or ALL. The logging.properties shipped with JDK is set to INFO. You can also target specific packages to collect logging from and specify a level. Here is how you would set debugging from Tomcat. You would need to ensure the ConsoleHandler's level is also set to collect this threshold, so FINEST or ALL should be set. Please refer to Sun's java.util.logging documentation for the complete details.



org.apache.catalina.level=FINEST
 
  


The configuration used by JULI is extremely similar, but uses a few extensions to allow better flexibility in assigning loggers. The main differences are:

A prefix may be added to handler names, so that multiple handlers of a single class may be instantiated. A prefix is a String which starts with a digit, and ends with '.'. For example, 22foobar. is a valid prefix.
As in Java 5.0, loggers can define a list of handlers using the loggerName.handlers property.
By default, loggers will not delegate to their parent if they have associated handlers. This may be changed per logger using the loggerName.useParentHandlers property, which accepts a boolean value.
The root logger can define its set of handlers using a .handlers property.
System property replacement for property values which start with ${systemPropertyName}.

Example logging.properties file to be placed in $CATALINA_BASE/conf:


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





Example logging.properties for the servlet-examples web application to be placed in WEB-INF/classes inside the web application:


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
最終更新:2009年06月18日 16:22