2012-02-04 1 views
40

Sto creando un'app Node.js e sto utilizzando Winston per la maggior parte dei miei scopi di registrazione. Sono anche a conoscenza della funzione Connect/Express logger e so che ha un'opzione di streaming ... È possibile inviare tutti i dati dalla funzione di logger di Connect/Express a Winston? ... allora posso avere tutto il logging utile di cui ho bisogno?Come faccio ad inviare l'uscita del logger Connect/Express a Winston?

Trovo utile la registrazione che Connect/Express è utile, ma al momento i due sono in qualche modo separati ... Io preferirei che tutto funzionasse attraverso Winston ed i suoi trasporti.

Com'è possibile? Grazie, James

risposta

68

Ecco cosa ho fatto per risolvere questo problema. Utilizzare fondamentalmente l'opzione di flusso nel modulo connect/express logger per convogliare i messaggi attraverso winston. Ho scelto di utilizzare il livello di registrazione winston.info, utilizzare qualsiasi livello abbia senso per te.

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

Grazie. Questo mi farà proprio bene! Saluti! :) – littlejim84

+3

Ricordarsi di mollare il messaggio per evitare di ottenere newline nei registri – nflacco

+1

@nflacco chomp? – UpTheCreek

3

Ho avuto lo stesso problema, ho guardato in parti interne del modulo logger e praticamente replicato quello che c'è, in questo middleware personalizzati (avvertimento, CoffeeScript).

Come bonus, registra anche i dati utilizzando i campi dei metadati.

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