5

個々の webapp のレベルで処理しようとするのではなく、Tomcat のレベルに外部化しようとしている、特定のシステム上のすべての webapps 間でいくつかの共通のログ構成があります。使用している Web アプリケーションは、カスタム ハンドラーを使用してjava.util.loggingいるため、やや困難であることが証明されており、カスタム ハンドラーを tomcat のクラスローダーとうまく連携させる明白な方法はないようです。現時点では、これはすべてプロトタイプ段階です。

暫定版: Tomcat 7.0.32、Java 6。デフォルトの tomcat 7 のインストールでは、1 つの REST サービスがデプロイされており、構成に問題はありません。

まず、この回答のアドバイスに大まかに従って、カスタム ハンドラーを作成して jar を入れ、$CATALINA_HOME/libそのディレクトリが正しいディレクトリにあり、common.loaderこのディレクトリが含まれていることを確認しました。

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar

次に、logging.propertiesファイルを変更してハンドラーを追加しました。

handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler, my.custom.Handler

./startup.shただし、を実行すると、次のようになります。

[Loaded java.io.PrintWriter from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
[Loaded java.util.logging.StreamHandler from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
[Loaded java.util.logging.ConsoleHandler from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
Handler error
java.lang.ClassNotFoundException: my.custom.Handler
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:521)
    at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:464)
    at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:288)
    at java.util.logging.LogManager$2.run(LogManager.java:267) [...]

(これは と一緒JAVA_OPTS=-verbose:classです)。

関連するクラスが後でロードされるのを見ましたが、これは一貫性がないようで、おそらく前述の REST サービス (それを直接使用していた) のアーティファクトです。

CLASSPATHjar を直接追加すると、すべてが正しく機能するようになりますが、ローダーを変更するのではなく、これは一般的に推奨されないようです。

java.util.logging.Handler読み込まれる前にクラスローダーにカスタム (および後でフォーマッター) をきれいに追加する方法に欠けている特定のものはありlogging.propertiesますか?

あるいは、私が間違ったツリーを平気で吠えている場合は、java.util.logging.

4

1 に答える 1

4

Tomcat 全体のカスタム ロギングの場合、Tomcat ブートストラップ ClassLoader にクラスを挿入する必要があります。したがって、カスタム Handler と必要な依存関係を含む jar を起動スクリプトの CLASSPATH に配置する必要があります。$CATALINA_BASE/bin/setenv.sh にカスタム スクリプトを追加することをお勧めします。

#!/bin/sh

CLASSPATH="$CATALINA_BASE/bin/myhandler.jar"

または、Tomcat の起動時にスクリプト変数がロードされるときに、必要な jar を動的に収集できます。

于 2013-12-04T19:37:05.753 に答える