从普通日志升级为请求链路日志
从“发送与返回”到完整请求链路:Node.js 网络日志系统的设计与实现
为什么需要网络日志
- 在很多项目中,网络请求日志最初都很简单:
请求发送了什么
服务返回了什么- 我们无法直接判断:
请求是否真正发送到了上游
是连接失败还是请求超时
是否已经收到响应头
响应内容是否在传输过程中中断
上游返回了哪个 HTTP 状态码
一次请求经历了哪些处理阶段它不抓取 TCP 数据包,也不监听系统中的全部网络流量,而是在业务请求的关键位置主动记录事件,把一次请求从开始到结束的过程串联起来。
什么是请求链路日志
- 本文所说的“网络日志”,准确来说是“请求链路日志”。
它记录的是应用程序发起外部 HTTP 请求时的业务过程,包括:
请求开始时间
请求编号
上游服务
输入数量
HTTP 状态码
请求耗时
网络错误类型
数据校验结果
最终保存结果- 它不记录:
DNS 查询过程
TCP 数据包
TLS 握手详情
系统中其他软件的网络请求- 这些阶段最终通过同一个请求编号关联:
requestId = abc123
请求开始时间 10:00:00
上游服务 Norixor
输入数量 25
HTTP状态码 200
请求耗时 8秒
网络错误类型 无
数据校验结果 通过
最终保存结果 成功- 请求失败
requestId = abc124
请求开始时间 10:01:00
上游服务 Norixor
输入数量 25
HTTP状态码 无
请求耗时 30秒
网络错误类型 connection_failed
数据校验结果 未执行
最终保存结果 失败状态已保存因此,它仍然属于应用日志,只是针对网络请求增加了更完整的上下文。
请求生命周期

- 一次外部 HTTP 请求通常会经历多个阶段:
常见错误类型
connection_failed:在连接上游服务时失败。response_timeout:请求已经发出,但等待响应头或读取响应体时超时。response_interrupted:已经开始接收响应,但响应体在传输过程中断。cancelled:请求在完成前被调用方或系统主动取消。timeout:通用超时类型,无法进一步判断具体阶段时使用。
版权所有
版权归属:念宇
