我正在创建一个Node.js应用程序,我正在使用Winston进行大多数日志记录。我也知道Connect / Express记录器功能并且知道它有一个流选项...是否可以将Connect / Express的记录器功能输出到Winston? ...那么我可以拥有我需要的所有有用的日志记录吗?
我发现Connect / Express的日志记录很有用,但目前这两个版本是分开的......我宁愿让它全部通过Winston运行它的传输。
怎么可能? 谢谢,詹姆斯
答案 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()