Как вывести вывод логгера Connect / Express на Winston? - PullRequest
40 голосов
/ 04 февраля 2012

Я создаю приложение Node.js и использую Winston для большинства целей ведения журналов.Я также знаю о функции регистратора Connect / Express и знаю, что у нее есть опция потока ... Можно ли вообще выводить данные из функции регистратора Connect / Express в Winston?... тогда у меня может быть все полезное ведение журнала, которое мне нужно?

Я нахожу ведение журнала, которое Connect / Express полезно, но на данный момент оба вида являются отдельными ... Я бы предпочел иметь этовсе проходит через Уинстон и его транспорт.

Как это возможно?Спасибо, Джеймс

Ответы [ 2 ]

69 голосов
/ 12 февраля 2012

Вот что я сделал, чтобы решить эту проблему.В основном используйте параметр потока в модуле подключения / экспресс-регистрации, чтобы передать сообщения в 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...
3 голосов
/ 21 октября 2013

У меня была такая же проблема, я заглянул внутрь модуля логгера и в значительной степени воспроизвел то, что есть, в этом пользовательском промежуточном программном обеспечении (предупреждение, 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()
...