Добавление ловушки для глобального журнала всех HTTP-ответов узла в node.js / express - PullRequest
9 голосов
/ 04 января 2012

Я использую node.js и express для обработки HTTP-запросов и ответов. Используя событие http.ServerRequest, я могу добавить подключение и регистрировать HTTP-запросы. Похоже, что для http.ServerResponse подобного события нет, и мне интересно, как записать все ответы HTTP с одним фрагментом кода, отправляемым моим сервером?

Ответы [ 4 ]

10 голосов
/ 04 января 2012

Я создал пакет, который делает такую ​​вещь из аналогичной необходимости. Проверьте экспресс-запрос-регистратор

Суть программы такова: она содержит дополнительный код, так что вы можете иметь собственную карту данных ключ-значение, которая регистрируется для каждого запроса:

// 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);
};

Приведенный выше код работает как промежуточное ПО в экспрессе. Посмотрите на код, и если у вас есть дополнительные вопросы, свяжитесь со мной здесь или github.

10 голосов
/ 30 декабря 2012

Больше не требуется monkeypatch, если в функции end () существует событие finish , так как node.js 0.8.12.

На самом деле, он был первоначально опубликован как end в 0.8.8 (проверьте также this ), но он нарушил дуплексы записываемых потоков , поэтому оно было переименовано, чтобы закончить.

3 голосов
/ 14 мая 2015

Если вы хотите только войти (запросы и / или ответы), проверьте express-winston . В отличие от morgan , он даже может регистрировать тело запроса / ответа.

Пример в 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 голосов
/ 04 января 2012

Если вы используете express 'res.send () для всех ответов, и вы не против вставить код в экспресс-модуль, вы можете вставить в

... / node_modules / экспресс / 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   }

Я не думаю, что вы можете прослушивать событие без ошибок - «close», похоже, не срабатывает при res.send () ;. Я думаю, это потому, что send () всегда вызывается где-то в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...