nestjs 日志问题 traceId

275 天前
 zzh2036

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

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