snbhsmt_log

ネットワークとコンピュータ、その他いろいろ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tomcat 5.5 は logging.properties を必ず読む

Tomcat 5.5 のログ出力に Log4j を利用する様にしても logging.properties で設定したログファイルは作成される。 だから、Log4j を利用する場合でも、 Logging API 関連の設定をしておく。

org.apache.commons.logging.impl.LogFactoryImpl#getLogClassName() によると commons-logging.jar と log4j.jar があれば Logging API の LogManager はインスタンス化されず logging.properties は読まれない筈なのだが、 おそらく階層構造のクラスローダの何処かで Log4j のクラスを見つけられない状況が発生しているのだろう。

という事で、Tomcat 5.5 のログ出力に Log4j を使っていて、 しかも無駄なファイルを作成したく無い場合は logging.properties から FileHandler の定義を削除する。 或いは catalina.sh は、$CATALINA_HOME/bin/tomcat-juli.jar が存在すると ClassLoaderLogManager を使用する為のシステム・プロパティを 環境変数 JAVA_OPTS に指定するので、 tomcat-juli.jar をリネームするのも有効だ。

  • Tomcat 5.5.23
  • Commons Logging 1.0.4
  • Log4j 1.2.14
スポンサーサイト

Tomcat 5.5 は JDK 1.4 で使用

Tomcat 5.5 を JDK 1.4 で動かす場合、アーカイブ中の RUNNING.txt にあるように、 別途 apache-tomcat-5.5.*-compat.* ファイルをダウンロードしてインストールする。 このアーカイブには以下の 3 つのファイルが含まれるので、これを Tomcat のインストール・ディレクトリを基準とした同じパスにコピーするだけ。

  • bin/jmx.jar
  • common/endorsed/xercesImpl.jar
  • common/endorsed/xml-apis.jar

そういえば Tomcat 5.5.20 + JDK 1.4.2_13 で起動した時、 以下のメッセージが catalina.out に出力されていたが、 すぐ JDK 1.5 に移行するつもりなので放っておく。

Created MBeanServer with ID: 1f6f0bf:10e919613c5:-8000:baxter:1

Tomcat 5.5 で Log4j の XML 形式設定ファイルを利用

Tomcat 5.5 でログ出力に Log4j 1.2.x を利用していて、 設定を XML 形式の log4j.xml ファイルで行うと、設定内容によっては エラーが発生する。 その理由と対応を考えた。

log4j:WARN Continuable parsing error 133 and column 80
log4j:WARN Attribute value "org.apache.catalina.core.ContainerBase.[Catalina].[localhost]" of type ID must be a name.

Tomcat 5.5 から Host や Context に対応するロガー名として以下の様に ブラケットで囲んだ名前を利用出来る様になった。

<logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]">
        :
</logger>
しかし Log4j 1.2.x の log4j.dtd によると logger 要素の name 属性の 属性タイプは ID であり、そこに文字 '[', ']' や '/' は記述できない。 よって上記の様なロガー名を指定すると XML 検証エラーとなる。
<!ELEMENT logger (level?,appender-ref*)>
<!ATTLIST logger
  name          ID      #REQUIRED
  additivity    (true|false) "true"  
>
よって、この様なロガー名を指定したい場合は log4j.properties ファイルで設定しなければならない。

しかし、どうしても log4j.xml で設定したい場合は、 log4j.dtd を書き換えてしまうという方法がある。 log4j.dtd は log4j*.jar の中の org/apache/log4j/xml ディレクトリに 存在するので、これを以下の様に属性タイプ CDATA に書き換えてしまう。

<!ELEMENT logger (level?,appender-ref*)>
<!ATTLIST logger
  name          CDATA   #REQUIRED
  additivity    (true|false) "true"  
>
十分検証した訳では無いけれど、これでエラーは出なくなる。

ちなみに Log4j 1.3.x では DTD を用いない様なので、 このエラーは元々発生しないらしい。

Tomcat 5.5 の ClassLoaderLogManager

Tomcat 5.5 が標準で利用するログマネージャ org.apache.juli.ClassLoaderLogManager クラスは、 Java 標準の Logging API のログマネージャ java.util.logging.LogManager から幾つかの点が拡張されている。

まず、同じクラス名のハンドラを、名前を付けて複数定義できる様になっている。 数字で始まるハンドラは、ピリオドで区切られた 2 番目以降のトークンを ハンドラの FQCN として解釈する。 よって最初のトークンを変える事によって 同じハンドラのインスタンスを複数定義できる。

Tomcat 5.5 に標準で含まれる logging.properties には 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler の様に org.apache.juli.FileHanlder ハンドラが複数定義されていて、 複数のファイルにログ出力する様になっている。

次に、クラス・ローダ毎にログを管理する様になっている。 よって、ハンドラやロガー・ツリーがクラス・ローダ毎に存在する。 初期化も各クラス・ローダ毎に java.util.logging.LogManager と ほぼ同じ様に行われる。 なので shared/classes に logging.properties を置けば ウェブアプリ共通のログを制御できるし、 foo/WEB-INF/classes に置けば foo ウェブアプリのログのみを制御できる。

クラス・ローダ毎に logging.properties を置く場合、 以下の様にルート・ロガーのハンドラを定義しないでおく。 なぜかは解らないが、そうしないとログが 2 行づつ出力されてしまう様だ。

handlers = 1foo.org.apache.juli.FileHandler

#.handlers = 1foo.org.apache.juli.FileHandler

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

jp.example.webapp.foo.level = FINE

Top

HOME

snbhsmt

Author:snbhsmt
Google Profiles

http://www.ksky.ne.jp/~snbhsmt/

全ての記事を表示する

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。