如何将Connect / Express的记录器输出输出到Winston?

时间:2012-02-04 13:52:56

标签: node.js logging express connect

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

我发现Connect / Express的日志记录很有用,但目前这两个版本是分开的......我宁愿让它全部通过Winston运行它的传输。

怎么可能? 谢谢,詹姆斯

2 个答案:

答案 0 :(得分:69)

以下是我为解决这个问题所做的工作。基本上使用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...

答案 1 :(得分: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()