< 返回版块

harlanc 发表于 2023-12-14 10:04

有没有日志库可以在每条日志中添加traceID, 目前使用了tokio库,要求在一个启动线程中做标记,然后在此线程的所有子孙线程中都是用和此线程相同的traceID

评论区

写评论
郭大路 2023-12-17 22:55

java 里面有个东西叫ThreadLocal 一般用这个去做,跨服务RPC传递通常用header或者隐式的参数传递 然后同一个jvm内用ThreadLocal传递。

作者 harlanc 2023-12-15 15:11

github.com/shanliu/lsys 这个老哥说的感觉比较靠谱,可以研究研究

--
👇
omega: 我的做法是,用tokio::task_local定义线程局部变量。在请求入口处生成id,在打印log的时候获取id,遇到tokio::spawn就自己写一个spawn,把id传递下去。处理并不理想,不过将就用,不过不能保证别人一定不用原生的tokio::spawn。

omega 2023-12-15 12:30

我的做法是,用tokio::task_local定义线程局部变量。在请求入口处生成id,在打印log的时候获取id,遇到tokio::spawn就自己写一个spawn,把id传递下去。处理并不理想,不过将就用,不过不能保证别人一定不用原生的tokio::spawn。

github.com/shanliu/lsys 2023-12-14 23:58

tracing 开始处理时 用span 到结尾 用span进行过滤即可拿到整个处理的相关日志。

--
👇
harlanc: 我写的有误,我写的线程指的就是协程,启动第一个协程做标记,此协程的子孙协程都使用和做标记的协程相同的traceID, 协程被窃取到其它线程,协程的父子关系不会变吧,这么做的目的就是在服务端的一个session处理能够通过traceID过滤出来所有相关日志,c++的log4cxx有此功能

--
👇
yuanyan3060: tokio多线程运行时有任务窃取,你的协程任务可能移动到其他线程,你这个需求无法按字面意思实现。

作者 harlanc 2023-12-14 14:22

我写的有误,我写的线程指的就是协程,启动第一个协程做标记,此协程的子孙协程都使用和做标记的协程相同的traceID, 协程被窃取到其它线程,协程的父子关系不会变吧,这么做的目的就是在服务端的一个session处理能够通过traceID过滤出来所有相关日志,c++的log4cxx有此功能

--
👇
yuanyan3060: tokio多线程运行时有任务窃取,你的协程任务可能移动到其他线程,你这个需求无法按字面意思实现。

yuanyan3060 2023-12-14 11:46

tokio多线程运行时有任务窃取,你的协程任务可能移动到其他线程,你这个需求无法按字面意思实现。

1 共 6 条评论, 1 页