2012-02-04 14 views
40

Robię aplikację Node.js i używam Winston do większości moich celów logowania. Zdaję sobie również sprawę z funkcji rejestratora Connect/Express i wiem, że ma opcję przesyłania strumieniowego ... Czy można w ogóle wyprowadzić dane z funkcji rejestratora Connect/Express do Winston? ... czy mogę mieć wszystkie przydatne rejestracje, których potrzebuję?Jak wyprowadzić dane wyjściowe rejestratora Connect/Express do Winston?

Uważam, że rejestracja Connect/Express jest przydatna, ale w chwili obecnej są one w pewnym sensie oddzielne ... Wolałbym, aby wszystkie te dane działały przez Winstona i jego transporty.

Jak to możliwe? Dzięki, James

Odpowiedz

68

Oto, co zrobiłem, aby rozwiązać ten problem. Zasadniczo użyj opcji stream w module logger connect/express, aby przesłać wiadomości do winstona. Zdecydowałem się użyć poziomu logowania winston.info, użyj tego, który poziom ma dla ciebie sens.

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

Dziękuję. To mi pomoże! Twoje zdrowie! :) – littlejim84

+3

Pamiętaj, aby zagłuszyć wiadomość, abyś nie uzyskał nowych linii w dziennikach – nflacco

+1

@ nflacco chomp? – UpTheCreek

3

miałem ten sam problem, spojrzałem do wewnętrznych modułu rejestratora i dość dużo replikowane, co tam jest w tym niestandardowego oprogramowania pośredniczącego (ostrzeżenie, coffeescript).

Jako bonus rejestruje dane również za pomocą pól metadanych.

(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() 
Powiązane problemy