node.js - HTTP响应发送后如何记录HTTP请求/响应信息?

标签 node.js express winston

我的 API 是用 Express 构建的。

开箱即用 morgan ,可以用作日志记录中间件。据我所知,它绑定(bind)到请求并监听事件,并能够在连接完成时收集数据。这使得它能够记录传输数据的时间和大小。

我更喜欢使用类似winston的东西尽管我希望通过我的服务器捕获更多有关 I/O 的数据,但它确实有适合我的良好传输选项。

我有自己的自定义通用响应函数,可以在从 API 端点响应时记录额外信息。

我无法对静态 Assets 的日志请求执行相同的操作。

因此,我非常需要能够有一个函数绑定(bind)到请求并在完成时进行日志记录,以便我可以跟踪所有请求的响应时间、响应大小和其他详细信息。

如何在仍然使用 winston 的情况下实现这一目标?

最佳答案

我很久以前就解决了这个问题......

最终使用此包来帮助检测响应 header 的写入时间(指示响应的结束)- 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();
});

关于node.js - HTTP响应发送后如何记录HTTP请求/响应信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28554822/

相关文章:

node.js - 我收到从 Angular 到 Node 中的 Post API 的多个调用

node.js - 如何在 Brunch 中设置环境变量

javascript - 使用Winston Logger登录/var/log失败

mysql - 无法使用 Sequelize 将 id 插入属于外键引用表的表中

node.js - req.logout() 不是一个函数

node.js - Jest 测试中未调用 Res.Redirect

express - PassportJS 本地无限循环认证

node.js - 对 Node.js 日志记录系统进行基准测试——我是否遗漏了一些相关信息?

node.js - 如何在 winston 自定义传输函数中获取记录器名称?

javascript - 内容未定义,错误为错误 :ENOENT, 打开 'C:\Windows\system32\hello.txt'