【问题标题】:How do I output Connect/Express's logger output to Winston?如何将 Connect/Express 的记录器输出输出到 Winston?
【发布时间】:2012-02-04 13:52:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: node.js logging express connect


    【解决方案1】:

    这是我为解决这个问题所做的。基本上使用 connect/express 记录器模块中的流选项将消息通过管道传输到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...
    

    【讨论】:

    • 记住要记住消息,以免日志中出现换行符
    • 具体应该是winston.info(message.slice(0, -1));
    • 值得注意的是,截至目前,logger 不再与 Express 捆绑在一起,应单独安装。对于这些问题,您可以尝试morgan,方式如下:app.use(require('morgan')('combine'));
    【解决方案2】:

    我遇到了同样的问题,我查看了 logger 模块的内部结构,并且在这个自定义中间件(警告、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()
    

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 2018-12-24
      • 2018-12-16
      • 2011-09-18
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多