我正在使用node.js和express来处理HTTP请求和响应。通过使用http.ServerRequest
事件,我可以添加一个钩子并记录HTTP请求。 http.ServerResponse
似乎没有类似的事件,我想知道如何使用我的服务器发送的一段代码记录所有HTTP响应?
答案 0 :(得分:10)
我创建了一个包含这样的东西的包,出于类似的需要。查看express-request-logger
程序的核心是这样的,它包含一些额外的代码,因此您可以拥有自己的每个请求记录的数据键值映射:
// 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);
};
以上代码在express中作为中间件运行。看看代码,如果您还有其他问题,请在这里或github与我联系。
答案 1 :(得分:9)
monkeypatch不再需要,只要在end() function上发出结束事件,因为node.js为0.8.12。
实际上,它最初在0.8.8中发布为结束(另请查看this)但it broke writable streams' duplexes,因此已重命名为完成。
答案 2 :(得分:3)
如果您只想记录(请求和/或回复),请查看express-winston。 Unlike 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
}));
答案 3 :(得分:-6)
如果您对所有响应使用快速'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 }
我认为你不能听一个非错误的事件 - res.send();似乎没有触发“关闭”。我猜是因为send()总是在代码中的某个地方调用。