Как я могу выводить выходные данные Connect/Express в Winston?
Я создаю приложение Node.js, и я использую Winston для большинства моих целей ведения журнала. Я также знаю о функции Connect/Express logger и знаю, что у нее есть опция потока... Возможно ли вообще вывести материал из функции Connect/Express logger в Winston?... тогда у меня может быть все полезное ведение журнала, в котором я нуждаюсь?
Я нахожу, что протоколирование Connect/Express полезно, но в данный момент эти два являются отдельными... Я бы предпочел, чтобы все это выполнялось через Winston и оно переносилось.
Как это возможно?
Спасибо, Джеймс
Ответы
Ответ 1
Вот что я сделал, чтобы решить эту проблему. В основном используйте параметр потока в модуле connect/express logger для передачи сообщений через 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...
Ответ 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()