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
Dodawanie haka do globalnego rejestrowania wszystkich odpowiedzi HTTP węzła w pliku node.js/express
Odpowiedz
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.
W aktualnych wersjach Node.js 'res' powinno generować' 'finish'' zdarzenie, którego możesz użyć zamiast proxy metody zakończenia. –
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.
To jest zły pomysł. Zobacz inne odpowiedzi, zamiast tego. –
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ć.
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). –
Czy można uzyskać komunikat odpowiedzi na zdarzenie zakończenia? –
'Końcówka' wydaje się działać również dla mnie, natomiast' zakończenie' nie. Jestem zmieszany! – JoeRocc
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
}));
To jest nowoczesna i chyba najbardziej poprawna odpowiedź na dzisiaj. –
- 1. Czy istnieje możliwość haka globalnego wyjątku?
- 2. Prawidłowe podejście do globalnego rejestrowania w Golang
- 3. Używanie węzła JS do proxy http i modyfikowanie odpowiedzi
- 4. Dodawanie wspólnego haka do js-mode
- 5. Przepisz nagłówki odpowiedzi za pomocą węzła-http-proxy
- 6. Automatyczne dodawanie proxy do wszystkich połączeń HTTP w ruby
- 7. Dodawanie atrybutów do węzła XML
- 8. Dodawanie nowej trasy do węzła ekspresowe
- 9. Dodawanie węzła do obiektu nodeQueue podczas tworzenia
- 10. Dodawanie komentarza do węzła za pomocą SnakeYaml
- 11. Dodawanie niestandardowej odpowiedzi Nagłówki do APIException
- 12. Dodawanie js do formularza węzła Drupal
- 13. Dodawanie węzła/właściwości do drzewa wyrażeń
- 14. Żądanie węzła (odczyt strumienia obrazu - powrót rury do odpowiedzi)
- 15. Django: Przekaż zmienną do rejestrowania pliku ustawień
- 16. Dodawanie nowego węzła do istniejącego obiektu XmlDocument
- 17. sposób rejestrowania WYCHODZĄCYCH żądań https z węzła w ramach Webstorm
- 18. Wymagania i odpowiedzi rejestrowania w ramkach sieci Spark:
- 19. Usługa rejestrowania żądań SOAP i odpowiedzi w języku C#
- 20. Dodawanie nagłówka do odpowiedzi HTTP w działaniu wewnątrz kontrolera w asp.net/mvc
- 21. Porównaj odpowiedzi html za pomocą węzła js
- 22. Moduły globalnego węzła nie instalują się poprawnie. Polecenie nie znaleziono
- 23. Git to svn: Dodawanie daty zatwierdzenia do rejestrowania wiadomości
- 24. Dodawanie javascript do wszystkich stron w OpenCart
- 25. Funkcje dot-sourcingowe z pliku do globalnego zasięgu wewnątrz funkcji
- 26. Możliwe utworzenie globalnego nieskopiowanego w pliku application.cfc?
- 27. Python: zwyczaj rejestrowania we wszystkich modułach
- 28. Zastosowań Content-Disposition w nagłówku odpowiedzi HTTP
- 29. Przestawianie wartości „Cache-Control” w odpowiedzi HTTP
- 30. Kod odpowiedzi HTTP po przekierowaniu
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
Dzięki, skończyłem na poprawianiu przez małpy metod http.ServerResponse - działało świetnie. –