2008/06/24

ログAPIの使用

Flex、AIRでのデバッグ時にはtrace()を使っていたけど、パフォーマンス的によろしくないのでログAPIでログ情報を出力するようにTRYしてみた。

ログ API の使用
http://livedocs.adobe.com/flex/3_jp/html/help.html?content=logging_09.html

ログカテゴリには完全修飾クラス名を指定するのが規則なんだけど、イチイチ書くのは面倒なのでターゲットのオブジェクトを渡すと、そのオブジェクトの完全修飾クラス名を内部で取得して、そのカテゴリに関連付けられたロガーを返してくれるユーティリティを作ってみた。
ちなみにLogTargetのフィルターを指定していて、汎用性に欠けていることには後で気がついた・・・。

それと疑問なのが、LogTargetのフィルターでmx.messaging パッケージと mx.rpc パッケージを指定していないんだけど、BlazeDSでRPCするとログ情報が山ほど出てきてしまう。
そのため、Log.flush()を呼んで関係のないロガーを削除しているんだけど、Log.flush()はデバッグ専用で使っちゃまずそうなので後でなんとかしよう。

package net.air_life.utils
{
import flash.utils.getQualifiedClassName;

import mx.logging.ILogger;
import mx.logging.Log;
import mx.logging.LogEventLevel;
import mx.logging.targets.TraceTarget;

public class LogUtil
{
private static var logTarget:TraceTarget;

public static function getLogger(targetObj:Object):ILogger
{
if(!logTarget)
{
//デバッグ専用なのでここで使うのはまずいね
//http://livedocs.adobe.com/flex/3_jp/langref/mx/logging/Log.html#flush()
//mx.messaging パッケージと mx.rpc パッケージ配下のすべてのログ情報が出てしまうためにflushしている。
Log.flush();

var logTarget:TraceTarget = new TraceTarget();
logTarget.level = LogEventLevel.WARN;
//メッセージをログに出力するクラスを指定
logTarget.filters = ["net.air_life.hoge.*"];
logTarget.includeDate = true;
logTarget.includeTime = true;
logTarget.includeCategory = true;
logTarget.includeLevel = true;

Log.addTarget(logTarget);
}

//完全修飾クラス名は "net.air_life.hoge::Hoge"のような文字列なので、"::"をカテゴリ名に使える"."に置換している。
var category:String = getQualifiedClassName(targetObj).replace("::", ".");
var logger:ILogger = Log.getLogger(category);

return logger;
}
}
}

使い方はこう。
flash.utils.getQualifiedClassName()を使って、thisからログカテゴリに指定する完全修飾クラス名を作っている。

var logger:ILogger = LogUtil.getLogger(this);
logger.debug(event.target.toString());

0 件のコメント: