2012-01-03 18 views
8

Używam węzłów node.js i express do obsługi żądań HTTP i odpowiedzi. Korzystając ze zdarzenia http.ServerRequest, mogę dodać podpięcie i zarejestrować żądania HTTP. Wydaje się, że nie ma podobnego zdarzenia dla http.ServerResponse i zastanawiam się, jak zalogować wszystkie odpowiedzi HTTP za pomocą jednego kawałka kodu, który wysyła mój serwer?Dodawanie haka do globalnego rejestrowania wszystkich odpowiedzi HTTP węzła w pliku node.js/express

+0

Nie ma sposobu, aby to zrobić. '' request' 'jest wysyłane przez' HttpServer', który wyraża rozszerzenia. Najprostszym sposobem jest nadpisanie '.send' lub' .end' za pomocą cienkiego proxy logowania. – Raynos

+0

Dzięki, skończyłem na poprawianiu przez małpy metod http.ServerResponse - działało świetnie. –

Odpowiedz

10

Stworzyłem pakiet, który robi coś takiego, z podobnej potrzeby. Sprawdź express-request-logger

Sercem programu jest tak, że zawiera jakiś dodatkowy kod, dzięki czemu można mieć swój własny klucz-wartość mapę danych, która zostanie zalogowany na życzenie:

// Save the real end that we will wrap 
var rEnd = res.end; 

// To track response time 
req._rlStartTime = new Date(); 

// Proxy the real end function 
res.end = function(chunk, encoding) { 
    // Do the work expected 
    res.end = rEnd; 
    res.end(chunk, encoding); 

    // And do the work we want now (logging!) 

    // Save a few more variables that we can only get at the end 
    req.kvLog.status = res.statusCode; 
    req.kvLog.response_time = (new Date() - req._rlStartTime); 

    // Send the log off to winston 
    var level = req.kvLog._rlLevel; 
    delete req.kvLog._rlLevel; 
    logger.log(level, '', req.kvLog); 
}; 

Powyższy kod działa jako middleware w ekspresowym. Spójrz na kod, a jeśli masz więcej pytań, skontaktuj się ze mną tutaj lub github.

+0

W aktualnych wersjach Node.js 'res' powinno generować' 'finish'' zdarzenie, którego możesz użyć zamiast proxy metody zakończenia. –

-6

Jeśli używasz Express' res.send() dla wszystkich odpowiedzi, a ty nie masz nic wstawianie kodu do modułu ekspresowej, można wstawić do

.../node_modules/express/lib/response.js:

43 res.send = function(body, headers, status){ 
44 console.log("\n...your log text here..." + body); 
45 // allow status as second arg 
46 if ('number' == typeof headers) { 
47  status = headers, 
48  headers = null; 
49 } 

nie sądzę, można słuchać na razie bez błędów - „blisko” nie wydają się ognia na res.send() ;. Chyba dlatego, że send() jest zawsze wywoływany gdzieś w kodzie.

+4

To jest zły pomysł. Zobacz inne odpowiedzi, zamiast tego. –

8

Nie jest już potrzebny do monkeypatch, o ile wystąpi zdarzenie zakończenia emitowane na end() function od pliku node.js 0.8.12.

Właściwie, to pierwotnie został opublikowany jako koniec w 0.8.8 (sprawdzić), ale również thisit broke writable streams' duplexes, więc została zmieniona, aby zakończyć.

+2

Sprawdziłem węzeł 0.8.14 i 0.8.23 oraz "koniec", a nie "zakończenie". Połączone zobowiązania są zawarte w gałęziach 0.9/0.10 (teraz jest wyświetlane przez GH poniżej komunikatu zatwierdzenia od kilku tygodni). –

+0

Czy można uzyskać komunikat odpowiedzi na zdarzenie zakończenia? –

+0

'Końcówka' wydaje się działać również dla mnie, natomiast' zakończenie' nie. Jestem zmieszany! – JoeRocc

3

Jeśli chcesz tylko rejestrować (żądania i/lub odpowiedzi), sprawdź numer express-winston. Unlike morgan, może nawet rejestrować treść żądania/odpowiedzi.

przykład w coffeescript:

expressWinston.requestWhitelist.push('body') 
expressWinston.responseWhitelist.push('body') 
app.use(expressWinston.logger({ 
     transports: [ 
     new winston.transports.Console({ 
      json: true, 
      colorize: true 
     }) 
     ], 
     meta: true, // optional: control whether you want to log the meta data about the request (default to true) 
     msg: "HTTP {{req.method}} {{req.url}}", // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}" 
     expressFormat: true, // Use the default Express/morgan request formatting, with the same colors. Enabling this will override any msg and colorStatus if true. Will only output colors on transports with colorize set to true 
     colorStatus: true, // Color the status code, using the Express/morgan color palette (default green, 3XX cyan, 4XX yellow, 5XX red). Will not be recognized if expressFormat is true 
     ignoreRoute: function (req, res) { return false; } // optional: allows to skip some log messages based on request and/or response 
    })); 
+0

To jest nowoczesna i chyba najbardziej poprawna odpowiedź na dzisiaj. –

Powiązane problemy