JS・WSHでロギング・ログ出力に使う便利関数の案


よく使うコードの雛形。 ====

/*

	JS/WSH・JScriptでロギングをするライブラリ
	
	ver 0.1

*/


// 標準出力にログ書き出し
function log(s){ WScript.Echo(s); }


// "文字列".log()
String.prototype.log = function(){
	log( this );
};


// 標準エラー出力にログ書き出し
// リダイレクトされずにコンソールにも表示される。
// バッチの出力をテキストにリダイレクトしていても,
// コンソール上でリアルタイムに出力を確認できる。
function err(s){
	try{
		WScript.StdErr.WriteLine(s); 
	}catch(e){
		// GUIで実行された場合は標準出力だけでよい
	}

	// 標準出力にも同時に書き出される
	log(s);
}


// ベンチ用
function tic(){
	tic.startTime = new Date().getTime();
}
function tac(){
	var ms = new Date().getTime() - tic.startTime;
	tac.time_span = ms / 1000;
}
function how_many_seconds(){ // 計測時間が何秒だったかを返す
	return tac.time_span;
}


工夫したところ:

  • 標準出力と標準エラー出力に同時に書き出して,リアルタイムで確認可能にしつつも記録を残せるようにしたところ。linuxでいうとteeコマンドを使うわけだが,Windowsでそれをやるのは面倒なので。
  • コマンドの実行時間を簡単にベンチにかけられる。
  • Stringを拡張してlogできるようにしたのは面白い。いつも,コードの行頭に戻ってlogのカッコでくくりなおすのは面倒だったから。

alert() と書くために,わざわざ行頭に戻らなくてもすむ方法
http://d.hatena.ne.jp/language_and_engineering/20100829/p1

  • 文字列(「str」とか 「"hoge"」 )を書いてから, そのあとで alert() と書きたい。 要するに,文字列変数をタイプした直後,「あ,この変数の内容を表示したいんだった」と気づいて,alert() を書くだけのためにわざわざ行頭に戻って,文字列変数を alert() で囲むのが面倒。


今後の課題:

  • ブラウザ上ならconsole.logやalertに自動で切り替えられるようにしたい。また,ログの出力先のtextareaを指定できるとよい。
  • ログ出力時に,各行ごとに時刻が出るとよい。
  • ログの種類を充実させて,警告,デバッグ,エラーなどの種類が使い分けられるようにしたい。
  • さまざまな変数をダンプできるとよい。dumpメソッドに各種の型を渡せるようにするのもよいし,Arrayを拡張してdumpメソッドを持たせるのもよい。
  • logの第二引数とかで,ログ出力を抑制することができるとよい。本番環境ではログが出力されないように,ロギングのレベルや有無を個別に調節可能に。