f 固有のログタイプ
Home of: [工房 "藤車"] > [SourceForge.net における PTLog]

固有のログタイプ

本節では、 分類のための固有のログタイプの定義方法を説明します。

デモンストレーション実装のbasic.type パッケージに属するクラス群も参照してください。

概要

クラス名

本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。

PTLog のクラス

表記 完全名
InfoLogType jp.ne.dti.lares.foozy.ptlog.InfoLogType
LevelTypeConverterFactory jp.ne.dti.lares.foozy.ptlog.logapi.LevelTypeConverterFactory
Log jp.ne.dti.lares.foozy.ptlog.Log
LogAPIProvider jp.ne.dti.lares.foozy.ptlog.logapi.LogAPIProvider
LogBuffer jp.ne.dti.lares.foozy.ptlog.LogBuffer
LogTap jp.ne.dti.lares.foozy.ptlog.LogTap
LogType jp.ne.dti.lares.foozy.ptlog.LogType
PropertiesConverterConfig jp.ne.dti.lares.foozy.ptlog.PropertiesConverterConfig
ServiceProvider jp.ne.dti.lares.foozy.ptlog.ServiceProvider
TypeConverter jp.ne.dti.lares.foozy.ptlog.TypeConverter
UniversalFormatter jp.ne.dti.lares.foozy.ptlog.format.UniversalFormatter

新しい LogType の定義

固有の LogType 定義はとても簡単です。 InfoLogType の派生クラスの例を以下に示します。


public class SQLInfoLogType
    extends InfoLogType
{
    // 資源効率上、以下の値を使用する
    final static
    public SQLInfoLogType INSTANCE = new SQLInfoLogType();

    public SQLInfoLogType(){
        super();
    }
}

新しい LogType

Log および LogTap の拡張

これで、簡素ではないながらも、 以下のようなコードにより、 固有タイプによるログ要求を発行できます。


    public void doSomething(){
        Log log = TAP.getLog("doSomething");

        log.info("Info 型によるログ");

        log.log(SQLInfoLogType.INSTANCE,
                "SQLInfo 型によるログ");
    }

生のメソッド起動による要求

以下のような Log カスタマイズにより、 このような煩雑さを減少させることが出来ます。


public class CustomLog
    extends Log
{
    ....

    final
    public void sqlInfo(Object data){
        log(SQLInfoLogType.INSTANCE,
            data);
    }

    final
    public void sqlInfo(String message,
                        Throwable throwable)
    {
        log(SQLInfoLogType.INSTANCE,
            message, 
            throwable);
    }

    final
    public LogBuffer forSQLInfo(){
        // デフォルトフォーマッタを使用
        return getLogBuffer(SQLInfoLogType.INSTANCE);
    }

    final
    public LogBuffer forSQLInfo(UniversalFormatter formatter){
        return getLogBuffer(SQLInfoLogType.INSTANCE,
                            formatter);
    }

    final
    public boolean enablesSQLInfo(){
        return enables(SQLInfoLogType.INSTANCE);
    }

    ....
}

固有型向けの Log 拡張

固有の Log を直接取得出来るように、 LogTap も拡張した方が良いでしょう。


public class CustomTap
    extends LogTap
{
    ....

    final
    public CustomLog getCustomLog(String method){
        return new CustomLog(getContext(),
                             method,
                             getFormatter());
    }

    final
    public CustomLog getCustomLog(String method,
                            UniversalFormatter formatter)
    {
        return new CustomLog(getContext(),
                             method,
                             formatter);
    }

    ....
}

CustomLog のための LogTap 拡張

以上の作業により、 以下のようなコードで固有の型によるログ要求を発行できます。


    public void doSomething(){
        CustomLog log = TAP.getCustomLog("doSomething");

        log.sqlInfo("log with SQLInfo type");
    }

    ....

    final static
    public CustomTap TAP = new CustomTap(Client.class);

便利なメソッド経由での要求発行

型変換の設定

固有型によるログ要求を行うクライアントコードは書ける様になりましたが、 ログの型に関する設定はまだです。 例えば、 SQLInfoLogTypeInfoLogType として扱われるため、 他の InfoLogType 派生クラスと同じ 「レベル」でログ記録されます。

PTLog は LogType から 基底ログフレームワークに固有な任意のオブジェクトへの変換機能を提供します。 このような機構は、 LogAPIProvider 等の基底クラスである ServiceProvider クラスで提供されています。

本節では、 "*.properties" ファイルを記述することで ServiceProvider の設定を行うという、 最も簡単な方法に関して説明します。

備考: 型変換の詳細に関しては、 ServiceProvider および TypeConverter の API ドキュメントを参照してください。

はじめに、 基底ログフレームワークを決定する必要があります。 本節では、JDK Logging API が選択されたものとします。

次に、 以下のような "*.properties" ファイルを書きます。


## これはコンバータのファクトリクラスの別名を指定します。
## 複数の別名も指定可能です。
##
##   KEY SYNTAX: ptlog.typeConverter.alias.任意の文字列
## VALUE SYNTAX: 別名|ファクトリクラス完全名
##
ptlog.typeConverter.alias.01 = \
    level|jp.ne.dti.lares.foozy.ptlog.logapi.LevelTypeConverterFactory

## これは変換設定を指定します。
##
##   KEY SYNTAX: ptlog.typeConverter.component.任意の文字列
## VALUE SYNTAX: 別名|LogTypeFQN,レベル値,表示ラベル[,Bundle 名]
##
ptlog.typeConverter.component.01 = \
    level|your.package.SQLInfoLogType,800,SQLInfo
ptlog.typeConverter.component.02 = \
    level|your.package.NetworkInfoLogType,799,NetworkInfo
ptlog.typeConverter.component.03 = \
    level|your.package.LogicInfoLogType,800,LogicInfo
    ....

型変換設定

LevelTypeConverterFactory は、 指定されたパラメータから JDK Logging API における Level を生成するファクトリクラスです。 指定されるパラメータは:

  1. LogType 派生クラスの完全名
  2. "level" として使用する数値
  3. ラベル文字列
  4. resource bundle における名前(オプション)

ですので、 JDK Logging API の設定が INFO(= level 値 800)レベル以上の要求のみを記録する場合、 上記の設定は、 SQLInfoLogType および LogicInfoLogType でのログ要求が通る一方で、 NetworkInfoLogType でのログ要求が破棄される結果となります。

備考: 個々の基底ログフレームワーク間の差が、 ファクトリクラス間のパラメータ仕様の差となりますから、 API ドキュメントでファクトリクラスの詳細を参照してください。

PTLog が既に対応しているログフレームワークに関しては、 対応する各パッケージのパッケージ説明文において、 適切な型変換を行うファクトリクラスを示しています。

これまでの設定を元に、以下のような起動を行うことで、 型変換設定を行うことが出来ます。


PropertiesConverterConfig configure =
PropertiesConverterConfig.DISALLOW_FAILURE;
// 不正設定により例外が浮揚されることを意味します

configure.add(LogAPIProvider.INSTANCE, filename);
// JDK Logging API との接続点において
// "filename" に記述された設定を追加することを意味します。

型変換設定の読み込み

PropertiesConverterConfig は他にも "add()" メソッドのシグネチャバリエーションを持っています。 詳細は API ドキュメントを参照してください。