現在、-Djava.util.logging.config.file を使用して指定された単一のログ構成で Tomcat 7 を使用しており、-Djava.util.logging.manager="org.apache.juli.ClassLoaderLogManager" を使用してデフォルトの ClassLoaderLogManager を使用しています。これは、1 回限りのスタートアップ構成に最適です。
いくつかのサーブレットと、サーブレット コンテキストの外部で実行されるその他のコードがあります。完全に制御する専用の tomcat サーバーで実行し、すべてのコードで同じログ構成を使用する必要があります。ロギングには java.util.logging API を使用しています。これは、LogManager.getLogManager().getLogger(name) が機能する必要があり、Logger.isLoggable(Level) が機能する必要があることを意味します。
ClassLoaderLogManager は、サーブレットが個々のログ設定を指定できるようにするという、私たちの状況とは反対の方向に向けられているようです。すべてのログを 1 か所で管理したいと考えています。しかし、改善された FileHandlers のような他の JULI の利点が必要です。
ここで質問:アプリケーションをリロードせずに実行時にファイルからこれらの設定をリロードするにはどうすればよいですか?
私が試したこと:
- LogManager.getLogManger.readConfiguration(): Thread.currentThread.getContextClassLoader() はシステム クラスローダーではないため、ClassLoaderLogManager で効果的な NOOP が発生します。
- Thread.setContextClassLoader(ClassLoader.getSystemClassLoader()) を明示的に設定してから、上記を呼び出します。これは実際に構成ファイルを読み取りました (デバッガーでステップスルー) が、含まれている ClassLoader 内の既存のロガーに変更を伝達しませんでした。Logger.setLevel() が既存のロガーで呼び出されることはありませんでした。
- これらの呼び出しの前に reset() を呼び出しても何も変わらないようです。
- JMX は、単一の ClassLoader (おそらくシステム ClassLoader) のロガーのみを公開しているようです。