如何记录 Node 中的每个 http.request

Ali*_*ter 9 node.js

我想记录特定节点应用程序及其所有模块发出的每个 http 请求。将请求包装在一个函数中可以适用于所有非模块代码,缺点显然是它不包含模块代码,而且操作起来很麻烦。

这是针对已经在生产中的应用程序,我想到的唯一其他选择是 tcpdump。

Sly*_*nal 41

设置NODE_DEBUG=http将使节点将详细的HTTP请求信息记录到控制台。

例子:

NODE_DEBUG=http,http2 node index.js

NODE_DEBUG=http,http2 npm start
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请参阅:

截至 2023 年 12 月 6 日,这是可用NODE_DEBUG属性的列表(基于上面的博客文章并检查 Nodejs 源代码):

  • 子进程
  • 紧急服务管理
  • FS
  • http
  • https
  • http2
  • 检查
  • 模块
  • 政策
  • 重复
  • 源映射
  • 溪流
  • 流套接字
  • 测试
  • 测试运行者
  • 定时器
  • tls
  • 追踪
  • 工人

您可以将多个模块作为逗号分隔列表传递:NODE_DEBUG=http,http2,tls


如何在nodejs源代码中查找模块ID:

不幸的是,nodejs 文档中没有可用的调试模块 ID 的列表。

要在源中查找 ID:搜索/grep Nodejs.js文件以供.debuglog(使用:

# Grep inside the nodejs project
$ grep -r -E --color "\.debuglog\('" nodejs/lib
Run Code Online (Sandbox Code Playgroud)

这将返回如下结果:

let debug = require('internal/util/debuglog').debuglog('esm', (fn) => {

let debug = require('internal/util/debuglog').debuglog('http2', (fn) => {
Run Code Online (Sandbox Code Playgroud)

传递给的字符串.debuglog(...)(例如“esm”和“http2”)是可以传递给的模块ID NODE_DEBUG

  • 无法记录http body? (5认同)

Ali*_*ter 7

好的,我找到了我要找的东西。

https://www.npmjs.com/package/http-debug