2012-02-04 29 views
40

私はNode.jsアプリケーションを作っています。私はWinstonを私のログの目的の大部分に使っています。私はConnect/Expressロガー機能についても認識しており、ストリームオプションを持っていることを知っています... Connect/Expressのロガー機能からWinstonにすべてのものを出力することは可能ですか? ...私は必要なログをすべて手に入れることができますか?Connect/Expressのロガー出力をWinstonに出力するにはどうすればよいですか?

は、私は、Connectは/便利エクスプレスログを見つけることが、今の並べ替えの分離されている2つの...私はそれウィンストン、それのトランスポート経由で実行されているすべてを持っていることを好む必要があります。

どうすれば可能ですか? おかげで、ジェームズ

答えて

68

ここでは、私はこの非常に問題を解決するために何をしたかです。基本的には、connect/expressロガーモジュールのstreamオプションを使用して、メッセージをwinstonにパイプします。私はwinston.infoログレベルを使用することを選択しました。

var winston = require('winston'); 
var express = require('express'); 

var app = express.createServer(); 

// enable web server logging; pipe those log messages through winston 
var winstonStream = { 
    write: function(message, encoding){ 
     winston.info(message); 
    } 
}; 
app.use(express.logger({stream:winstonStream})); 

// now do the rest of your express configuration... 
+0

ありがとうございました。それは私をちょうどいいよ!乾杯! :) – littlejim84

+3

ログに改行を入れないようにメッセージを書き留めておきます – nflacco

+1

@nflacco chomp? – UpTheCreek

3

私は同じ問題を抱えていた、私はロガーモジュールの内部に見て、かなりこのカスタムミドルウェア(警告、CoffeeScriptの)で、そこにあるものに複製します。

ボーナスとして、メタデータフィールドも使用してデータを記録します。

(req, res, next) -> 
    sock = req.socket 
    req._startTime = new Date 
    req._remoteAddress = sock.socket && sock.socket.remoteAddress || sock.remoteAddress; 

    _url =() -> req.originalUrl || req.url 
    _method =() -> req.method 
    _respTime =() -> String(Date.now() - req._startTime) 
    _status =() -> res.headerSent && res.statusCode || null 
    _remoteAddr =() -> req.ip || req._remoteAddress || (req.socket?.socket? && req.socket.socket.remoteAddress) || req.socket.remoteAddress 
    _usrAgent =() -> req.headers['user-agent'] 

    logRequest =() -> 
    res.removeListener 'finish', logRequest 
    res.removeListener 'close', logRequest 
    winston.info "#{_method()} #{_url()} #{_status()} #{_remoteAddr()} #{_usrAgent()} #{_respTime()}", 
     http_access: 
     method: _method() 
     url: _url() 
     status: _status() 
     remote_address: _remoteAddr() 
     user_agent: _usrAgent() 
    res.on 'finish', logRequest 
    res.on 'close', logRequest 

    next() 
関連する問題