top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
ログメッセージ定義書という Excel ブックから、ロギング・ソースコードを自動生成する blancoLogMessage というプロダクトを新規作成しました。
blanco Frameworkのロギング関連プロジェクトとして、ログメッセージ定義書という Excel ブックから、ロギング・ソースコードを自動生成するblancoLogMessage というプロダクトを新規作成しました。かねてよりロギング周りを Excel ブックから生成する実装の必要性/重要性を痛感していました。このプロダクトがロギングにまつわるプログラミングの劇的な改善をもたらすことを期待します。※現在、仕様の調整中のフェーズで、開発版と位置づけます。ここ数日中にフィードバックを頂ければ、仕様に反映させることができる可能性があります。
blancoLogMessgae を利用すると、以下のような Excel ブックの記載から ロギングのためのソースコードを自動生成することができます。
例によって、実行時には ランタイム・ライブラリは不要です。
ログレベルやメッセージが Excel ブックに集約しており、ログにまつわる全体像を容易に俯瞰できる点が非常に魅力的です。
自動生成されたソースコードは、以下のような記述によって利用することができます。 利用例 その1
new Sample2LogMessage().logMessage002("置換文字列");
Excel ブックの キー名称にしたがって、対応するメソッド名が生成されます。
Excel ブックの メッセージ文字列から、必要に応じて対応する置換文字列のための引数が生成されます。
利用例 その2
new Sample2LogMessage().logMessage001(new IllegalArgumentException("例外の例"));
実際に生成されるソースコードは、以下のようになります。
現実的には、規模の大きいプロジェクトにおいては自動生成するソースコードはカスタマイズする必要が出てくる可能性が高いものと考えます。(生成後のソースコードは変更してはなりません。自動生成のプログラムを変更するのです)
例: log4j のコードを生成へとにカスタマイズ。
例: ロギング・オブジェクトのインスタンスをフィールド変数で保持。
これとは別に、国際化対応のためのクラスが別途 1 つ自動生成されます。 Sample2LogMessage.java
``` /*
import java.util.logging.Level; import java.util.logging.Logger;
/** * ログメッセージのサンプル。このクラスは単にサンプルです。実際の動作には利用されません。 / public class Sample2LogMessage { /* * ログメッセージをプロパティファイル対応させるための内部的に利用するリソースバンドルクラス。 */ protected final Sample2LogMessageResourceBundle fBundle = new Sample2LogMessageResourceBundle();
/**
* ログメッセージ定義ID[Sample2]、レベル[FATAL]、キー[MESSAGE001]の文字列をロギングします。
*
* No.1:
* 文字列[メッセージのサンプル。その1。]
*/
public void logMessage001() {
Logger.getLogger("blanco.sample.logmessage").log(Level.SEVERE, "[MESSAGE001] fatal: " + fBundle.getMessage001());
}
/**
* ログメッセージ定義ID[Sample2]、レベル[FATAL]、キー[MESSAGE001]の文字列をロギングします。
*
* No.1:
* 文字列[メッセージのサンプル。その1。]
*
* @param argThrown 例外。
*/
public void logMessage001(final Throwable argThrown) {
Logger.getLogger("blanco.sample.logmessage").log(Level.SEVERE, "[MESSAGE001] fatal: " + fBundle.getMessage001(), argThrown);
}
/**
* ログメッセージ定義ID[Sample2]、レベル[ERROR]、キー[MESSAGE002]の文字列をロギングします。
*
* No.2:
* 文字列[メッセージ置換文字[{0}]が置換されます。]
*
* @param arg0 置換文字列{0}の値。
*/
public void logMessage002(final String arg0) {
Logger.getLogger("blanco.sample.logmessage").log(Level.SEVERE, "[MESSAGE002] " + fBundle.getMessage002(arg0));
}
/**
* ログメッセージ定義ID[Sample2]、レベル[ERROR]、キー[MESSAGE002]の文字列をロギングします。
*
* No.2:
* 文字列[メッセージ置換文字[{0}]が置換されます。]
*
* @param arg0 置換文字列{0}の値。
* @param argThrown 例外。
*/
public void logMessage002(final String arg0, final Throwable argThrown) {
Logger.getLogger("blanco.sample.logmessage").log(Level.SEVERE, "[MESSAGE002] " + fBundle.getMessage002(arg0), argThrown);
}
/**
* ログメッセージ定義ID[Sample2]、レベル[WARN]、キー[MESSAGE003]の文字列をロギングします。
*
* No.3:
* 文字列[メッセージ置換文字[{0}]に加え、もうひとつ[{1}]が置換されます。]
*
* @param arg0 置換文字列{0}の値。
* @param arg1 置換文字列{1}の値。
*/
public void logMessage003(final String arg0, final String arg1) {
Logger.getLogger("blanco.sample.logmessage").log(Level.WARNING, "[MESSAGE003] " + fBundle.getMessage003(arg0, arg1));
}
/**
* ログメッセージ定義ID[Sample2]、レベル[WARN]、キー[MESSAGE003]の文字列をロギングします。
*
* No.3:
* 文字列[メッセージ置換文字[{0}]に加え、もうひとつ[{1}]が置換されます。]
*
* @param arg0 置換文字列{0}の値。
* @param arg1 置換文字列{1}の値。
* @param argThrown 例外。
*/
public void logMessage003(final String arg0, final String arg1, final Throwable argThrown) {
Logger.getLogger("blanco.sample.logmessage").log(Level.WARNING, "[MESSAGE003] " + fBundle.getMessage003(arg0, arg1), argThrown);
}…以下略…
```
ちなみに、以下の Web記事のおかげで、ずっとペンディングしていた blancoLogMessage 開発に着手することができました。※とはいえ、blancoLogMessage が、これらの Web記事・Web日記に記載されている課題を解決できるかどうかは別の問題です。(私の感覚的には、これらは同じ課題ものなのですけれども…)
オレンジニュース: 2008-10-31: 適切なオーバーロードが存在しないjava.util.logging http://secure.ddo.jp/~kaku/tdiary/20081031.html#p04
川口耕介の日記: 2008/10/30: [jdk] java.util.loggingはもちょっとなんとかならんのか http://d.hatena.ne.jp/kkawa/20081030/p1