S2でのLoggerクラスの使い方


S2コアの中にはlog4jをラップした便利なLoggerクラスがあります。私はこのクラスを正しく使っていなかったので、ここに整理しておきます。

主要クラス

  • org.seasar.framework.log.Logger
    • Commons Logging(実際にはlog4j)をラップしたクラス
    • 内部的には次のMessageFormatterを利用している
  • org.seasar.framework.message.MessageFormatter
    • java.text.MessageFormat, java.util.ResourceBundleを内部で利用している

準備するもの

  • XXXMessages.properties
    • 「XXX」の3文字がシステム名になる
  • XXXMessages_ja.properties
    • 日本語対応する場合は、ロケールに合わせたプロパティファイルを用意する

例:RMIMessages_ja.properties

以下はS2RMIで使用しているログメッセージようのプロパティファイルです。

DRMI0001=RMIレジストリをポート {0} で作成しました。
DRMI0002=オブジェクトをカスタムRMIソケットファクトリを使用して
         サービスポート {0} で公開しました。
DRMI0003=オブジェクトをサービスポート {0} で公開しました。
DRMI0004=公開したオブジェクト "{0}" をRMIレジストリにバインドしました。
プロパティファイルの中身
メッセージコード(8桁)=メッセージ
メッセージコード
メッセージコード(8桁)=メッセージ種別(1桁)+システム名(3桁)+連番(4桁)
メッセージ種別
D = DEBUG, I = INFO, W = WARN, E = ERROR, F = FATAL

ソース内での記述方法(基本)

org.seasar.framework.log.Logger.getLogger()メソッドでLoggerクラスのインスタンスを取得し、以下のようにlog()メソッドを利用します。

    logger.log("DRMI0001", new Object[] { Integer.toString(this.registryPort) });

実際に表示される内容は以下の通り。

DEBUG 2005-06-01 00:44:49,616 [main] RMIレジストリをポート 1108 で作成しました。

log()メソッド

org.seasar.framework.log.Loggerのlog()メソッドは2種類あります。

  • public final void log(String messageCode, Object[] args)
    • 内部的には次のlog()メソッドの第3引き数をnullにして呼び出す
  • public final void log(String messageCode, Object[] args, Throwable throwable)

3つの引数を持つlog()メソッドは、内部でメッセージコードからメッセージ種別を判別し、対応するCommons Loggingのメソッド(debug, info, warn, error, fatal)を呼び出します。


また、内部的にはこの処理の直前でisEnabledFor()メソッドを呼び出しており、Commons Loggingの各isEnableメソッド(isDebugEnabled, isInfoEnabled, isWarnEnabled, isErrorEnabled, isFatalEnabled)によるロギング処理の実行チェックを行っています。