web-dev-qa-db-ja.com

オンデマンドでlog4j2構成をリロードする

Log4j2.xml構成ファイルを30秒ごとにチェックするように設定しています。

<Configuration status="WARN" monitorInterval="30">
    ...
</Configuration>

プログラムでlog4j2にタイムアウトの代わりに構成の変更を確認するように指示することは可能ですか?

N.B。プログラムで構成ファイルを指定して構成をロードするのではなく、log4j2に、以前にロードされた構成ファイルを監視して、monitorIntervalの有効期限が切れたかのように確認させるだけです。

ありがとう!

19
jamp

私は解決策を見つけたようです:

((org.Apache.logging.log4j.core.LoggerContext) LogManager.getContext(false)).reconfigure();

誰かがこれで何か間違っている/副作用を見ますか?

23
jamp

現在、これを行うための明確な方法はありません。それは反射で行うことができます。 (もちろん、これは実装が変更されると壊れる可能性があります。)

更新:これは間違っています。ありますisクリーンな方法です。以下のjampの回答を参照してください。

org.Apache.logging.log4j.core.LoggerContext ctx = (org.Apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);

org.Apache.logging.log4j.core.config.FileConfigurationMonitor mon = (org.Apache.logging.log4j.core.config.FileConfigurationMonitor) ctx.getConfiguration().getConfigurationMonitor();

// use reflection to get monitor's "nextCheck" field.
// set field accessible
// set field value to zero

mon.checkConfiguration();
5
Remko Popma