2012-02-04 84 views
40

我正在制作一个Node.js应用程序,我正在使用Winston进行大部分日志记录。我也知道Connect/Express记录器功能,并知道它有一个流选项...是否可以将Connect/Express的记录器功能输出到Winston? ...那么我可以拥有所有我需要的有用日志?如何将Connect/Express的记录器输出输出到Winston?

我发现Connect/Express有用的日志记录,但此刻这两者是分开的......我宁愿将它全部运行通过Winston并且它是传输。

这怎么可能? 谢谢,詹姆斯

回答

68

这是我做了什么来解决这个问题。基本上使用connect/express logger模块中的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 2012-02-22 18:25:01

+3

记得跺脚的消息,以免你在日志中换行 – nflacco 2012-09-25 20:06:46

+1

@nflacco chomp? – UpTheCreek 2012-10-31 12:31:02

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()