connect

express向けconnect-ltsv-loggerを作った

ltsvのビッグ・ウェーブを眺めてたら最初にgem作ってたのが知人でびっくりして、俺もなんかやってみたいなーと思いつつ作ってみました。

connect-ltsv-logger

Node.js用のparserはもうあったし、それならstreamでって思ったけど Stream難しいので挫折してるうちに、ltsv-streamも登場していたので、 logを出力する側からアプローチしてみた。

こんな感じでexpressやconnectのMiddlewareとして使用します。

サンプル


              var express = require("express"),
                  ltsvlogger = require('connect-ltsv-logger');
              
              // define output WriteStream
              var out = fs.createWriteStream("ltsv-access.log",{flags: 'a+'}),
              
              // define tokens
              var ltsv = [];
              ltsv.push("host");
              ltsv.push("ident");
              ltsv.push("user");
              ltsv.push("time");
              ltsv.push("req");
              ltsv.push("status");
              ltsv.push("size");
              ltsv.push("referer");
              ltsv.push("ua");
              
              var app = express();
              app.configure(function(){
                // app.set(/*snip*/)
                // ...
              
                app.use(ltsvlogger({format:ltsv,stream:out}));
              
                // app.use(/*snip*/)
                // ...
              });
              

指定したTOKENをltsv形式でログ出力します。connect.loggerのラッパーなので元のオプションもそのまま使えます。

引数

  • format: String or 例のようにTokenのArrayが使えます。
  • stream :本家と同じ。ltsvにするのでstdoutじゃなくてファイルに書いた方が使いがいがあるかも。
  • buffer: 本家と同じ。
  • immediate: 本家と同じ。

使用可能なFormat

connect.logger'sのformatsをltsv形式にオーバーライドしているだけです。

  • default
    host:127.0.0.1ident:-user:-time:[Wed, 13 Feb 2013 10:00:55 GMT]req:GET / HTTP/1.1status:200size:110referer:-ua:-`
  • short
    host:127.0.0.1ident:-req:GET / HTTP/1.1status:200size:-response-time:1 ms`
  • tiny
    req:GET /status:200size:-response-time:1 ms
  • dev

    concise output colored by response status for development use (Not ltsv format).

使用可能なTokens

identとか良くわかんないけど、connectも”−”にしてたので...(汗)

  • time

      logger.token("time",function(){
                      return "[" + moment().format("DD/MMM/YYYY:HH:mm:ss Z") + "]" ;
                    });
  • host

      logger.token("host",function(req,res){
                      return req.connection.address().address || '-';
                    });
  • X-Forwarded-For

      logger.token("X-Forwarded-For",function(req,res){
                      return res.getHeader("X-Forwarded-For") || "-";
                    });
  • user

      logger.token("user",function(req,res){
                      return '-';
                    });
  • ident

      logger.token("ident",function(req,res){
                      return '-';
                    });
  • req

      logger.token("req",function(req,res){
                      var ret = [];
                      ret.push(req.method);
                      ret.push(req.url);
                      ret.push("HTTP/"+req.httpVersion);
                      return ret.join(" ");
                    });
  • method

      logger.token("method",function(req,res){
                      return req.method;
                    });
  • uri

      logger.token("uri",function(req,res){
                      return url.parse(req.url).href;
                    });
  • protocol

      logger.token("protocol",function(req,res){
                      return url.parse(req.url).protocol;
                    });
  • status

      logger.token("status",function(req,res){
                      return res.statusCode;
                    });
  • size

      logger.token("size",function(req,res){
                      return res.getHeader("content-length");
                    });
  • reqsize

      logger.token("reqsize",function(req,res){
                      if(req.body) return req.body.length;
                      return "-";
                    });
  • referer

      logger.token("referer",function(req,res){
                      return req.headers['referer'] || req.headers['referrer'];
                    });
  • ua

      logger.token("ua",function(req,res){
                      return req.headers['user-agent'];
                    });
  • vhost

      logger.token("vhost",function(req,res){
                      return req.headers["host"];
                    });
  • reqtime

      logger.token("reqtime",function(req,res){
                      return new Date - req._startTime;;
                    });
  • X-Cache

      logger.token("X-Cache",function(req,res){
                      return res.getHeader('X-Cache');
                    });
  • X-Runtime

      logger.token("X-Runtime",function(req,res){
                      return res.getHeader('X-Runtime');
                    });

            |i
                   \      |.|
                    ト\   /| ト
                    | トヽ   / | | ト
                    | | トヽ\/| | | ト    /
                    | | | ト\≧三ミゞ=イ/
                   ム彡''´ ̄ ̄    ̄ ヽ{__..
                  /             V´
                  ノ  __          ',
               ,. == y ̄, __、\_        )      世 界 的 で す も ん ね
               |i  }-| ゝ二 |/ ̄ ̄  /ニ,l
               ヽ__ノ/ヾ _ ノ       > }}
                / >≦'__        し /        乗 る し か な い
                 Vて二オカ       (_,/}
                 Yこ二ノ!!|          }         こ の ビッ グ ウ ェ ー ブ に
                  Y⌒ 从        ∠)
                  从从从トミ   _.ィニ二 ̄丶
                   ミ三三彡 ' ´      \ \
                      /           \ヽ
                    /            ミ;,. ', ',
                     |   _  _ __    \',.',
                    ノ!   | V7\ ´/
                   / l /_ゝ| ト >__/ /
                   |   ヽン ´  ヽー'
                  i|                l
                  |:! ヽ              |
                  | ト、 `ミ,            l