ロギング

NarwhalにはロギングのためのAPIも用意されている。

用途や利用方法はLog4jなど他の言語向けのロギングライブラリと似ているが、ソースコードを見る限りログレベルによるフィルタリングや固定フォーマットで出力するといった程度の機能しか実装されておらず、まだ試験的なAPIであることが伺える。

Loggerは個別にインスタンスを作成して利用することもできるが、以下のようにsystemオブジェクトに定義されているLoggerを利用することもできる。

ロギングAPIの使用例

// 自前でLoggerを作成
var Logger = require("logger").Logger;
var logger = new Logger("test.log");
logger.level = Logger.DEBUG;
logger.debug("This is Narwhal Logging Example!");

// systemオブジェクトのLoggerを使用
system.log.level = Logger.DEBUG;
system.log.debug("This is Narwhal Logging Example!");

出力されるログの例

Sun Jun 28 2009 00:39:45 GMT+0900 (GMT+09:00) [debug] This is Narwhal Logging Example!

Loggerオブジェクトにはログレベルに応じて以下のログ出力用メソッドが用意されており、実行時にどのレベルのログを出力するかはlevelプロパティに設定する。

  • fatal()
  • error()
  • warn()
  • info()
  • debug()

ログの出力フォーマットを変更するにはLoggerのformatメソッドをオーバーライドすればよい。

ログフォーマットのカスタマイズ

logger.format = function(severity, args){
  return "["+Logger.SEV_LABEL[severity].toUpperCase()+"] "
    + new Date()
    +Array.prototype.join.apply(args, [" "]).replace(/\n/g, "");
};

HTTP通信とバイナリデータ

http.jsではHTTPによる通信を行い、レスポンスを手軽に取得するためのユーティリテが提供されている。

以下の例にあるように、read関数は引数にURLを取り、レスポンスをByteStringオブジェクトとして返却する。ByteStringを通常の文字列に変換するには引数に文字コードを指定したtoString()メソッドを呼び出せばよい。

HTTP通信の例

var http = require("http");

var byteStr = http.read("http://www.google.co.jp/");
print(byteStr.toString("Windows-31J"));

なお、Narwhalではバイナリデータを扱うためのクラスとして上述のByteStringとByteArrayという2つのクラスが用意されている。

ByteStringは不変オブジェクトでありStringオブジェクトと同様のAPIをサポートする。ByteArrayは可変オブジェクトであり、バイナリデータの編集を行う際に利用できる。それぞれtoByteArray()やtoByteString()といったメソッドで相互変換を行うことができる。

ByteStringとByteArrayの変換

var string = "文字列";
var byteString = string.toByteString("UTF-8");
var byteArray = byteString.toByteArray();

*  *  *

今回はNarwhalのAPIの中でも利用頻度が高いと思われるものを中心に紹介した。

Narwhalはサーバサイドでの利用を前提としていることを考えると特にファイルシステム関連のAPIは頻繁に利用することになるはずだ。外部コマンドの実行なども簡単に行うことができるため、シェルスクリプトの代替手段としても活用することができるのではないだろうか。

Narwhalにはこの他にも様々なAPIが含まれており、今後はRDBMSとのインタフェースなども整備されていくようだ。現時点ではまだ実験的なプロダクトという感が否めないが、Narwhalを使用して本格的なWebアプリケーションを開発できるようになる日も遠くないかもしれない。