nestjs 日志问题 traceId

2023-08-11 17:26:10 +08:00
 zzh2036

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

2418 次点击
所在节点    Node.js
23 条回复
lzgshsj
2023-08-11 17:50:43 +08:00
没用 winston ,用的 pino ,自带了 genReqId 的方法
NessajCN
2023-08-11 17:51:15 +08:00
既然是你自己做的服务那你就在 logger.log()的时候把你要的 traceId 加进去呗....
没怎么看懂你有什么进一步需求
zzh2036
2023-08-11 17:57:59 +08:00
@NessajCN 需要调用其他函数的时候,traceId 要当做参数继续传递下去吗?因为之前没有做过 traceId 这些,所以想知道一些详细的方案。traceId 的生成能和 jwt 中的 userId 做一些关联吗?
zzh2036
2023-08-11 18:00:20 +08:00
@lzgshsj 你是用了 fastify 还是 express 配合 pino 使用的?
NessajCN
2023-08-11 18:05:02 +08:00
@zzh2036 哦所以你问的是 tracerId 的生成问题而不是怎么在日志里加 id 的问题是吧?
这个讲道理没有什么固定规则呀当然你怎么看得顺眼怎么来。要我的话函数名加个时间戳么差不多了...最多再加个 api 名
thynson
2023-08-11 18:05:40 +08:00
nestjs 是不太好做的,所以我自己实现了一个类似的框架 sensejs
进一步了解: https://sensejs.io 或者 https://github.com/sensejs/sensejs
thynson
2023-08-11 18:07:05 +08:00
zzh2036
2023-08-11 18:10:34 +08:00
@NessajCN 有如何在日志中加 id 的疑问,刚才说的 logger.log()直接加 traceId ,那如果调用其它函数,traceId 要当做参数继续往下传递是吧?
thynson
2023-08-11 18:14:30 +08:00
@zzh2036 NestJS 印象中我是这么做的,在依赖注入框架下,然后在每个类初始化的时候用,可以把 requestId 注入进来,并关联到 Logger 上,requestId 的产生需要定义一个 provider 。当然这种做法还是有一定的侵入性
NessajCN
2023-08-11 18:16:07 +08:00
@zzh2036 这个都是你自己决定的…你想接着用这个 id 就往下传,想用个新的就再生成一个呗
zzh2036
2023-08-11 18:19:22 +08:00
@thynson 感谢大佬,我去试试
zzh2036
2023-08-11 18:19:47 +08:00
@NessajCN 感谢大佬,大概了解一些了
victimsss
2023-08-11 18:19:54 +08:00
@NessajCN 大概是在中间件使用 continuation-local-storage 或者 cls-hooked 记录 jwt 的 id 或者 生产的 reqId 然后供上下文使用,然后 logger 记录的时候不需要显式传参。
crysislinux
2023-08-11 18:27:11 +08:00
async hooks 不是 100%可靠的。这点比较坑,打日志可以用,但是不要做业务,比如存储 tenant id 之类的
zzh2036
2023-08-11 18:27:29 +08:00
@victimsss 总结的太棒了😀
Helios0
2023-08-11 21:20:13 +08:00
nestjs-cls https://papooch.github.io/nestjs-cls/
或者自己实现一个中间件也是一样的
zurmokeeper
2023-08-11 21:32:06 +08:00
个人暂时还是比较笨的方法实现,把 logger 对象挂在 req 上,请求的开头自己生成一个 traceid,挂上去,后续这个 req ,在 nestjs 的生命周期里都是能拿到的,然后用类似 req.logger.debug() 这种方式打印,整个生命周期就都是用 traceid 关联的了。如果还有其他服务,也可以把这个 traceid 放到请求头或者其他地方,一路传下去,也可以实现多个服务被一个 traceid 串起来的功能
owen800q
2023-08-12 00:25:39 +08:00
@z
@zurmokeeper 把 logger 放到 req 是個不錯的想法,反正 req 都要一直往下傳的
zzh2036
2023-08-14 10:09:29 +08:00
@Helios0 感谢大佬,这个 nestjs-cls 中 requestID 的 case ,比较符合我想要的效果
zzh2036
2023-08-14 10:13:26 +08:00
@zurmokeeper 很实用的想法,我之前想到在请求拦截中生成 traceId ,挂在 req 对象上,controller 里解出来,后续一直在 service 中做传递。但觉得应该有更优雅的实现

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

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

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

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

© 2021 V2EX