Logger Control: Using LogWriter(その1)

YUIのExampleの順を逆に行くようだが、Log4j(Java)、PEAR::Log(PHP)のようなLoggerを使い慣れた人には、(YUI Loggerの概要が1つのサンプルで分かるので)このサンプルから入るのが手っ取り早い。

画面は以下。

ここでポイントは

  1. LogReaderとは、YAHOO.widget.Loggerから吐かれたログを読むためのインターフェイスであって、それを入れるコンテナを指定するだけで、画面のような表示となる。
  2. Logの吐き出しは、YAHOO.log(sessage,category,source)の形式か、LogWriterインスタンスを作成することで行う。
  3. 上でcategoryには、"info","warn","error","time","window"が指定できる。また、sourceを指定するか、LogWriterインスタンスからログを吐き出すことで、ログを分類することができる(YAHOO.log()でsourceを指定指定しない場合には、defaultでglobalというソースが割り当てられる)
  4. sourceの指定、LogWriterインスタンスを生成した場合、そのfilterが、LogReaderに自動的に追加される。

である。

このLogReaderは、Draggableで、開閉できるなど、便利そうな機能がついている。

以下にHTMLの全文を示す。
scriptはモジュール・パターンに書き直した。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
<title>Ajax Sample</title> 
 
<style type="text/css"> 
body {
	margin:0;
	padding:0;
}
</style> 

<!-- Individual YUI CSS files -->
<link rel="stylesheet" type="text/css" href="scripts/yui/fonts/fonts-min.css">
<link rel="stylesheet" type="text/css" href="scripts/yui/logger/assets/skins/sam/logger.css">
<!-- Individual YUI JS files -->
<script type="text/javascript" src="scripts/yui/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="scripts/yui/dragdrop/dragdrop-min.js"></script>
<script type="text/javascript" src="scripts/yui/logger/logger-min.js"></script>

<style type="text/css" id="defaultstyle">
#main {
	margin: 2px;
	padding: 3px;
	width: 500px;
}

</style>

<script type="text/javascript"> 
//
//モジュールパターンで実装する。
//
YAHOO.namespace("EGP");

YAHOO.EGP.BasicLogging = function() {
	var myLogReader;
	var myLogWriter;
	
    function clickToLog(e) {
        
        YAHOO.util.Event.stopEvent(e);

        var target = YAHOO.util.Event.getTarget(e);
        var source = (YAHOO.util.Dom.hasClass(target, "MyClass")) ? "MyClass" : null;

        // target がクラス名としてMyClassを持っていないとき。YAHOO.log.(msg,cat,source)のsourceで指定。
        if(!source) {
            source = (YAHOO.util.Dom.hasClass(target, "myBucket")) ? "myBucket" : null;
            if(YAHOO.util.Dom.hasClass(target, "info")) {
                YAHOO.log("This is an \"info\" message.", "info", source);
            }
            else if(YAHOO.util.Dom.hasClass(target, "warn")) {
                YAHOO.log("This is a \"warn\" message.", "warn", source);
            }
            else if(YAHOO.util.Dom.hasClass(target, "error")) {
                YAHOO.log("This is an \"error\" message.", "error", source);
            }
            else if(YAHOO.util.Dom.hasClass(target, "time")) {
                YAHOO.log("This is a \"time\" message.", "time", source);
            }
        }
        // target がクラス名としてMyClassを持っているとき。=> 作成したLogWriterから吐き出す。
        else {
            if(YAHOO.util.Dom.hasClass(target, "info")) {
                myLogWriter.log("This is an \"info\" message.", "info");
            }
            else if(YAHOO.util.Dom.hasClass(target, "warn")) {
                myLogWriter.log("This is a \"warn\" message.", "warn");
            }
            else if(YAHOO.util.Dom.hasClass(target, "error")) {
                myLogWriter.log("This is an \"error\" message.", "error");
            }
            else if(YAHOO.util.Dom.hasClass(target, "time")) {
                myLogWriter.log("This is a \"time\" message.", "time");
            }
        }
    }
            
    return {
		init : function(){

		// LogReaderは、コンテナを指定すれば、自動的に(sourceやLogWriterを含んだ形で生成される。
        myLogReader = new YAHOO.widget.LogReader("container");
        myLogWriter = new YAHOO.widget.LogWriter("MyClass");

        YAHOO.util.Event.addListener(YAHOO.util.Dom.get("content"),
                "click",
                clickToLog, 
                this, 
                true);
	    }
	};
}();

//DOMが完全にloadされたら、サンプルを初期化する。
YAHOO.util.Event.onDOMReady(
		//DomReadyイベントで発火するハンドラ
		YAHOO.EGP.BasicLogging.init,
		//ハンドラに渡すオブジェクト(関数)
		YAHOO.EGP.BasicLogging,
		//ハンドラは、上記のオブジェクトのスコープをもつ。   
		true
);
</script>
</head> 
 
<body class="yui-skin-sam">
<div id="main">

<div id="container"></div>
 
    <div id="content">
    <p>1.defaultでは、ソースに紐付けられていないYAHOO.logのログは、global と認識される。</p> 
    <ul> 
    <li><a href="#" class="global info">Log an "info" message.</a></li> 
    <li><a href="#" class="global warn">Log a "warn" message.</a></li> 
    <li><a href="#" class="global error">Log an "error" message.</a></li> 
    <li><a href="#" class="global time">Log a "time" message.</a></li> 
    </ul> 
 
    <p>2.YAHOO.logのログの第3引数にソース(source)を指定して、ログを仕分けることができる。</p> 
    <ul> 
    <li><a href="#" class="myBucket info">Log an "info" message.</a></li> 
    <li><a href="#" class="myBucket warn">Log a "warn" message.</a></li> 
    <li><a href="#" class="myBucket error">Log an "error" message.</a></li> 
    <li><a href="#" class="myBucket time">Log a "time" message.</a></li> 
    </ul> 
 
	<p>3.LogWriterインスタンスを生成して吐き出すことで、ログを仕分けることもできる。</p>
    <ul> 
    <li><a href="#" class="MyClass info">Log an "info" message.</a></li> 
    <li><a href="#" class="MyClass warn">Log a "warn" message.</a></li> 
    <li><a href="#" class="MyClass error">Log an "error" message.</a></li> 
    <li><a href="#" class="MyClass time">Log a "time" message.</a></li> 
    </ul>
    </div> 
</div>
</body> 
</html>