torutkのブログ

ソフトウェア・エンジニアのブログ

JDK 6からjava.util.logger.Logger.globalが非推奨に

Java.netのフォーラムでの投稿で気づきました。java.util.loggerパッケージのLoggerクラスのstaticフィールドglobalが非推奨(Deprecated)となってしまいました。
http://forums.java.net/jive/thread.jspa?threadID=18530&tstart=0

Logger.globalは、System.out.println()を置き換えるもっとも簡単な方法であり、ロギングの習慣のないプログラマーにロギングを使ってもらう第一歩として重宝する機能でした。

   System.out.println("entering convert()");

デバッグ文を入れていたものを

   Logger.global.info("entering convert()");

のように置き換えるだけで、ロギング機構の制御(出力抑制、出力先など)が適用できるようになるのです。

ちなみにDeprecatedの理由は、初期化時のスレッド安全性の欠如(デッドロックの危険性)によるものです。
前に書いたJava Loggingのページでもこの方法をロギングの第一歩として取り上げていました。

代替手段として提唱されているのは以下の呼び出し方です。

   Logger globalLogger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
   :
   globalLogger.info("entering convert()");

ロギングの第一歩が遠のくような記述をすることになってしまいます。

JDK7でgetGlobal()メソッド(2012/03/07追記)

より、

これに対しJava SE 7では、getGlobalメソッドが新たに導入され、グローバルなLoggerオブジェクトを取得できるようになりました。もちろん、getGlobalメソッドで取得すればデッドロックは発生しません。

とのことで、グローバルロガーの取得が容易になりました。