続・log4jの設定を動的に変更するには?

今期は今日で終わり。でも既に来期のタスクのTracチケットがnew→assignedされてきましたとさ(涙)Tracって、ものぐさな開発者向けのツールらしいのだが、Tracを管理する人にとっては必須アイテムなようで(ー”ー;

さて、昨日に引き続きlog4jの設定を動的に変更するには?の第2段。結果はテスト工程でのお楽しみと思っていたが、後で泣きたくないので分かった事は書いておこう。そうしよう。
log4jの設定を動的に変更するには。さんが書いているように、まず、org.apache.log4j.LogManager の static ブロックを覗いてみた。

OptionConverter.selectAndConfigure(url, configuratorClassName,
                                   LogManager.getLoggerRepository());

なるほど・・・staticブロックの中で設定ファイルを読んでいるようだ。さらにOptionConverter.selectAndConfigure()を追跡すると、Configuratorインタフェースを実装したdoConfigureを呼び出している。

configurator.doConfigure(url, hierarchy);

ということは・・・実にシンプルかな。Configuratorインタフェースを実装したdoConfigureを呼び出すことで目的は達成できそう。幸いlog4jではXML用に、DOMConfigurator#doConfigure()が提供されており、具象クラスを自作しなくてもよい。いいとこ取りです。
しかしまぁ、このAPIのurl引数ではインターネットがイメージされがち(私だけ?ネット経由で設定ファイル取得はしないし)なので、DOMConfiguratorの

public void doConfigure(final String filename, LoggerRepository repository) {

を呼び出すことにする。あと、repositoryって呼び出し元で指定してもらっても困るのでラッパーを作って隠蔽することにする。したがって公開するAPIのほぼ完成系は、以下のようにしてみる。

public void doConfigure(final String filename) {
    Configurator configurator = new DOMConfigurator();
    configurator.doConfigure(filename, LogManager.getLoggerRepository());
}

さて結果は?・・・このメソッド呼び出しで動的に設定successful。複数スレッドへの伝播も確認できた。log4jがスレッドセーフ(つまり複数のスレッドに対応している)と言われる由縁はこんなところにもあったりするのかな。