如何在发送 HTTP 响应后记录 HTTP request/response 信息?
How to log HTTP request/response information after the HTTP response is sent?
我的 API 是用 express 构建的。
它开箱即用 morgan,可用作日志记录中间件。据我所知,它绑定到请求并侦听事件,并能够在连接完成时收集数据。这允许它记录传输数据的时间和大小。
我更愿意使用像 winston 这样的东西,它有适合我的非常好的传输选项,尽管我希望通过我的服务器捕获更多关于 I/O 的数据。
我有自己的自定义通用响应函数,当从我的 API 端点响应时,我能够记录额外信息。
我不能对静态资产的日志记录请求做同样的事情。
所以我非常需要能够绑定到请求并在完成时登录的函数,这样我就可以在 all 中跟踪响应时间、响应大小和其他详细信息请求。
如何在仍然使用 winston 的情况下实现这一目标?
我很久以前就解决了这个问题...
最终使用此包来帮助检测响应 headers 的写入时间(表示响应结束)- https://github.com/jshttp/on-headers
这是我作为中间件实现的代码,用于在每个响应结束时实现日志记录:
// Log Request
app.use(function (req, res, next) {
// Listen for response event and log
onHeaders(res, function () {
logger.info({
_id: req.id,
client: {
ip: function () {
return req.ip
|| req._remoteAddress
|| (req.connection && req.connection.remoteAddress)
|| undefined
}()
},
method: req.method,
url: req.url,
statusCode: res.statusCode,
time: (Date.now() - req.start),
'res-length': res._headers['content-length'] || 0,
'req-length': req.headers['content-length'] || 0
});
});
next();
});
我的 API 是用 express 构建的。
它开箱即用 morgan,可用作日志记录中间件。据我所知,它绑定到请求并侦听事件,并能够在连接完成时收集数据。这允许它记录传输数据的时间和大小。
我更愿意使用像 winston 这样的东西,它有适合我的非常好的传输选项,尽管我希望通过我的服务器捕获更多关于 I/O 的数据。
我有自己的自定义通用响应函数,当从我的 API 端点响应时,我能够记录额外信息。
我不能对静态资产的日志记录请求做同样的事情。
所以我非常需要能够绑定到请求并在完成时登录的函数,这样我就可以在 all 中跟踪响应时间、响应大小和其他详细信息请求。
如何在仍然使用 winston 的情况下实现这一目标?
我很久以前就解决了这个问题...
最终使用此包来帮助检测响应 headers 的写入时间(表示响应结束)- https://github.com/jshttp/on-headers
这是我作为中间件实现的代码,用于在每个响应结束时实现日志记录:
// Log Request
app.use(function (req, res, next) {
// Listen for response event and log
onHeaders(res, function () {
logger.info({
_id: req.id,
client: {
ip: function () {
return req.ip
|| req._remoteAddress
|| (req.connection && req.connection.remoteAddress)
|| undefined
}()
},
method: req.method,
url: req.url,
statusCode: res.statusCode,
time: (Date.now() - req.start),
'res-length': res._headers['content-length'] || 0,
'req-length': req.headers['content-length'] || 0
});
});
next();
});