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 のロギング機能の紹介でした。