latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

mofmof.js のログ機能

mofmof.js に実装されている4種類のログ出力機能を紹介します。

Local Remote Graph 機能
mm.log -- コンソールや
サーバのログに文字列を出力します
mm.log.warn -- コンソールや
サーバのログに警告文字列を出力します
mm.log.error -- コンソールや
サーバのログにエラー文字列を出力します
mm.iog mm.log の機能に加え、
関数呼び出しグラフを出力します

以下のサンプルコードは http://mofmof-js.googlecode.com/svn/trunk/test/base.js.htm でテストできます。


mm.log - console.log / server.log

mm.log("hogehoge", 123); とすることで、ブラウザのコンソールに文字列を出力します。

[ 2012-02-09T07:22:48.453Z ]: hogehoge 123

console.log をサポートしていないブラウザでは何もしません。

mm.log.remote = true;
mm.log.url = "http://example.com:8080/a.log?msg=@@";

とすることでサーバのアクセスログにも文字列を出力します。文字列中の最初の "@@" が mm.log の引数で置換されます。


mm.log("Hello remote log, こんにちはリモートログ") とすると、サーバにはこのような形でログが出力されます。

::1 - - [09/Feb/2012:16:05:04 +0900] "GET /a.log?msg=Hello%20remote%20log%2C%20%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AD%E3%82%B0 HTTP/1.1" 404 345 - - "http://mofmof-js.googlecode.com/svn/trunk/test/base.js.htm" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11"
mm.log.local = false;

とすることでコンソールログへの出力を禁止できます。



mm.iog - in/out, nested log

mm.iog はネストした関数呼び出しをグラフ化し、とても分かりやすい形で出力します。

Stream については 先日の記事 http://uupaa.hatenablog.com/entry/2012/02/07/165501 を参照してください。

コンソールに階層構造付きで呼び出し履歴(トレース)を出してみる。出来るだけダーティーな実装で - latest log で紹介したコードを元にクリーンに再実装しています。

var obj = "1000 > fn1 + fn2 > fn3 > fn4".stream({
    args: "Hello World",

    fn1: function(fn) {
        var io = mm.iog("fn1"); // IN

        10..lazy(function() {
            ~io;                // OUT
            fn(true);
        });
    },
    fn2: function(fn) {
        var io = mm.iog("fn2"); // IN

        io(this.args); // Hello World

        8..lazy(function() {
            io.out();           // OUT
            fn(true);
        });
    },
    fn3: function() {
        return false; // halt
    },
    fn4: function() {
        return true;
    },
    halt: function(factor) {
        mm.log(factor + " -> HALT");
        mm.log("this.halted -> " + this.halted);
    }
});

実行するとこうなります。実行経路がネストした状態で表示され、経過時間(span)の情報もあります。

[ 2012-02-09T06:58:36.930Z ]: ┌ fn1()
[ 2012-02-09T06:58:36.931Z ]: │┌ fn2() 
[ 2012-02-09T06:58:36.931Z ]: ││ fn2[ Hello World ]
[ 2012-02-09T06:58:44.932Z ]: │└ fn2(span:08.002)
[ 2012-02-09T06:58:46.931Z ]: └ fn1(span:10.001)
[ 2012-02-09T06:58:46.932Z ]: fn3 -> HALT
[ 2012-02-09T06:58:46.933Z ]: this.halted -> true

var io = mm.log(関数名または関数); でログブロックを開始し、
~io; または io.out() で ログブロックを抜けます。

# ~io; の ニョロは C++ のデストラクタをもじったものだと思ってください


以上、mofmof.js のロギング機能の紹介でした。