log4jの設定を動的に変更するには。

log4jを使うことはあっても、設定を動的に変える方法があるというのはあまり知られていないようです。

log4jの設定、つまりlog4j.propertiesやlog4j.xmlで設定するものを反映するには通常、クラスローダの再起動を必要とします。

実はそんなことはなく、再起動をせずに設定を更新することができます。以下のようにいくつか方法があります。

  • PropertyWatchDogを利用する
  • LogManager#resetConfiguration() を利用する
  • Configurator を自前で提供し、起動時オプションで -dlog4j.configuratorClass=クラス名を指定する

PropertyWatchDog を利用する方法は、一定時間ごとにプロパティファイルの更新をチェックし、必要であれば再読み込みする方式です。ただし、スレッドを勝手に作るためWebLogicなどのアプリケーションサーバでは使ってはいけないと思ってください。

LogManager#resetConfiguration() を利用する方法は、どこからかこのメソッドを呼ぶようにした仕組みを使ってLoggerHierarchyをリセットする方法です。設定用のコンソールやページを作るなり、専用のポートを作るといったタスクが発生するので好ましいかというと微妙なところです。※これでは設定が変わりませんでした

最後に挙げる方法がもっとも応用が利きそうです。これはConfiguratorインタフェースを実装した自前のクラスを使って設定を提供するというものです。間にキャッシュや変換の処理を好きなだけ入れることができます。何をすればどう動くかは、以下のソースコード

  • org.apache.log4j.LogManager の static ブロック
  • org.apache.log4j.helpers.OptionConverter の selectAndConfigure()
  • org.apache.log4j.xml.DOMConfigurator の doConfigure()
  • org.apache.log4j.varia.ReloadingPropertyConfigurator の doConfigure()

この4つを見ればわかると思うので、一度お試しください。