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メソッド」が使えるようになる。