nestjs 日志问题 traceId

289 天前
 zzh2036

nestjs(express)做了一个简单的服务
目前用 winston替换了 nestjs的默认日志及 typeorm的日志
有时候需要查看日志定位问题,所以想在日志中添加 traceId用于追踪一次 request的完整链路,最好是无代码侵入的
有查到使用 Async hooks进行 request上下文保存的
大家有没有已实现的方案?

2046 次点击
所在节点    Node.js
23 条回复
guiling
278 天前
当初网上确实找不到成熟方案,所以自己实现的,核心就是利用 AsyncLocalStorage
1 使用 express-request-id 作为日志的 traceid
2 基于 AsyncLocalStorage 自己写一个中间件,获取请求头里的 traceid 并赋值到 AsyncLocalStorage 的实例中,这个是最核心的,代码不多,node 版本好想要 14 以上,网上有相关教程
3 重写 console 的 log 合 error 方法,日志就用这两个,没用第三方 logger ,这样所有请求默认的日志就会带 traceid
4 关于定时任务因为不走请求所以没有 traceid ,需要自己随机生成一个然后在最外层包进去(我是机器时间+任务名)

最终效果大概这样
https://s2.loli.net/2023/08/22/9EOeUzQD5XvAqWj.png
定时任务的
https://s2.loli.net/2023/08/22/x4dHy8wcLiM5mP3.png

理论上最终可以做成想 java 那样的把模块方法名也打印出来
zzh2036
278 天前
@guiling 不错的实现方式。我目前直接引用了 nestjs-cls 这个包,全局注册时自定义了 traceid 生成规则,在 winston logger 的 printf 方法中通过 cls 取出 traceid 进行打印。
guiling
278 天前
@zzh2036 看了下原理一样的,也是基于 AsyncLocalStorage ,可惜当初做的时候这包还没出来,不然就省事了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/964527

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX