4月 8th, 2008at 10:49

Tags: ,

log4j 1.2.14のLoggerの拡張

このエントリーをはてなブックマークに追加

デフォルトのLoggerは優秀なのだが、

  • メソッドの開始ログを出力するメソッドが欲しい
  • リソースバンドルのキーを与えるとメッセージを取ってきてくれるメソッドが欲しい

といった拡張もしたくなる。

これまではLoggerクラスをラップして新しいクラスを作り、ラップクラスの中では、loggerを持っていて、処理をloggerに委譲してい
た。このやり方だと、getLoggerの引数にLoggerを使うクラスの完全修飾名を与えた場合、ラップクラスを使うクラスの数だけ、ラップクラスが
newされてしまう。

Loggerは内部でLogManagerLoggerRepositoryを使って、作成したLoggerの重複を管理していると思うのだが、これをサブクラスで実装しても、

  • Loggerでも管理してまーす
  • ラップクラスでも管理してまーす

となって気持ちが悪い。

こういう場合は、継承してメソッドを拡張する。このサブクラスの作り方はlog4jのexamplesフォルダ内を参考にすればいい。

場所:logging-log4j-1.2.14\examples\subclass

LoggerFactoryを作る

このクラスでは、Loggerを拡張したクラス(サブクラス)をnewする実装を書く。Loggerはこのfactoryクラスを使ってLoggerを作る。

public class AppLoggerFactory implements LoggerFactory {

   public AppLoggerFactory() {}

   public Logger makeNewLoggerInstance(String name) {       return new AppLogger(name);   }

}

Loggerを継承したサブクラスを作る

ここには拡張するメソッドを記述する。あとはLogger.getLoggerメソッドで、上で作ったLoggerFactoryを渡せば完了。

public class AppLogger extends Logger {

   private static final String FQCN = AppLogger.class.getName();   private static AppLoggerFactory factory = new AppLoggerFactory();

   public AppLogger(String name){       super(name);   }

   public static Logger getLogger(String name){       return (AppLogger) Logger.getLogger(name, factory);   }

   public void startLog(String className, String methodName){       if(super.isDebugEnabled()){           super.log(FQCN, Level.DEBUG, className + "." + methodName, null);       }   }}

Logger.getLoggerしたときにfacotryを与えることによって、LoggerはLogFactoryを使ってLoggerを作る。よってLoggerからAppLoggerにキャストできるオブジェクトを返してもらえる。

使ってみる

用意ができたので実際に使ってみる。使い方は簡単で、getLoggerして取得したオブジェクトを使うだけ。

AppLogger logger = AppLogger.getLogger("com.daipresents.test.logging.Log4jTest");logger.startLog("Log4jTest", "main");

上記の例だとデバッグレベルで出力してくれる「startLogメソッド」が使えるようになる。

このエントリーをはてなブックマークに追加