2012-02-04 8 views
40

Estoy haciendo una aplicación Node.js y estoy usando Winston para la mayoría de mis propósitos de registro. También estoy al tanto de la función de registrador Connect/Express y sé que tiene una opción de transmisión ... ¿Es posible enviar todo desde la función de registrador de Connect/Express a Winston? ... entonces puedo tener todo el registro útil que necesito?¿Cómo obtengo la salida del registrador de Connect/Express en Winston?

Creo que el registro que Connect/Express es útil, pero por el momento los dos están separados ... Preferiría tener todo corriendo por Winston y sus transportes.

¿Cómo es eso posible? Gracias, James

Respuesta

68

Esto es lo que hice para resolver este problema. Básicamente, use la opción de transmisión en el módulo de conexión/registro express para canalizar los mensajes a winston. Elegí usar el nivel de registro winston.info, use cualquier nivel que tenga sentido para usted.

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... 
+0

Gracias. ¡Eso me hará bien! ¡Aclamaciones! :) – littlejim84

+3

Recuerde masticar el mensaje para que no le den nuevas líneas en sus registros – nflacco

+1

@nflacco chomp? – UpTheCreek

3

que tenían el mismo problema, miré en la parte interna del módulo registrador y más o menos replicado lo que hay, en este middleware personalizado (advertencia, CoffeeScript).

Como beneficio adicional, también registra datos usando campos de metadatos.

(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() 
Cuestiones relacionadas