Home of: [工房 "藤車"] > [SourceForge.net における PTLog]

動機

このドキュメントは、 PTLog 開発に至る動機に関して説明します。

Requirements

本節では、ログフレームワークに対する、 以下に示す「私の」要求について説明します。

  1. 差し替え可能性
  2. 固有の分類
  3. 型ベースの分類
  4. 出力の整形
  5. 1レコードへの詰め込み

これはあくまで「私の」要求ですので、 「あなたの」要求ではないかもしれませんが、 多くの人が同様な要求を持っているものと考えています。

差し替え可能性

最近は、 幾つかのメジャーなログフレームワークが存在します。 著名なものとして、 JDK Logging API、 Apache Log4j および Jakarta Commons Logging があげられるでしょう。

そのため、 どのログフレームワークを選択すべきかは、 実行環境(例: アプリケーションサーバ)や、 共に利用されるライブラリ(例: DBMS アクセス、プレゼンテーション自動化等) のログフレームワーク利用状況に依存します。

そのため、 以下のような要求を満たすような、 基底(underlying)ログフレームワークの "差し替え可能性" が必要です。

固有の分類

ログ出力を分類するために、 固有の分類を定義したいです。

"固有の分類" とは、 一般的なログフレームワークにおける "固有のレベル(level)" とほぼ同義です。

型ベースの分類

ほぼ全てのログフレームワークでは、 スカラー値の "ログレベル" をログ出力の閾値(= 分類)として使用しています。

例えば、 "SQLDebug"、"NetworkDebug" および "LogicDebug" レベルを定義したとします。

コンパイル時にどのレベルの優先度が他よりも高いかを決定できますか? SQL 実装に着目している際には "SQLDebug" の優先度が他よりも高いでしょう。 しかし、他の状況では、"NetworkDebug" ないし "LogicDebug" の優先度が高いかもしれません。

各レベルの間での優先度は、 開発/保守のフェーズに依存しているように見受けられます。

そのため、 半順序関係を許容する分類階層が必要です。

それに加えて、 時には "SQLDebug"、"NetworkDebug" および "LogicDebug" の全てを、 "Debug" として扱いたい場合もあります。

そして、この目的には Java のクラス階層がフィットするように思われます。 そこで、"スカラー値ベースの分類" に相対するものとして、 Java のクラス階層を用いたものを "型ベースの分類" と呼びます。

勿論、各分類間での優先度を実行時に確定するための機構も必要です。

値の整形

例えば、 数値を16進数形式で整形したい場合があります。

時には明示的に整形形式を指定したいこともありますが、 時には全ての値をある形式で整形したいこともあります。

1レコードへの詰め込み

以下に示すような形式でメソッドのパラメータを出力したい場合があります。


p1=first,p2=second,p3=third,....

1レコードへの詰め込み

しかし私の知るログフレームワークは全て "+" 演算子による文字列片の結合を強制します。


logger.debug("p1=" + p1 + ",p2=" + p2 + ",p3=" + p3 ....);

文字列片の結合

情報を1レコードに詰め込むための、 よりエレガントな方法が必要です。

他のフレームワークを選択しない理由

各ログフレームワークにおける要求充足性は以下のようになります。

要求 JDK Logging API Apache Log4j JCL
差し替え可能性 no no yes
固有の分類 yes yes no
型ベースの分類 no no no
値の整形 no no no
1レコードへの詰め込み no no no

全ての要求を満たすためには、 新規のフレームワークを自分自身で開発しなければならない、 という結論になりました。