harlanc 发表于 2023-12-14 10:04
有没有日志库可以在每条日志中添加traceID, 目前使用了tokio库,要求在一个启动线程中做标记,然后在此线程的所有子孙线程中都是用和此线程相同的traceID
java 里面有个东西叫ThreadLocal 一般用这个去做,跨服务RPC传递通常用header或者隐式的参数传递 然后同一个jvm内用ThreadLocal传递。
github.com/shanliu/lsys 这个老哥说的感觉比较靠谱,可以研究研究
-- 👇 omega: 我的做法是,用tokio::task_local定义线程局部变量。在请求入口处生成id,在打印log的时候获取id,遇到tokio::spawn就自己写一个spawn,把id传递下去。处理并不理想,不过将就用,不过不能保证别人一定不用原生的tokio::spawn。
我的做法是,用tokio::task_local定义线程局部变量。在请求入口处生成id,在打印log的时候获取id,遇到tokio::spawn就自己写一个spawn,把id传递下去。处理并不理想,不过将就用,不过不能保证别人一定不用原生的tokio::spawn。
tracing 开始处理时 用span 到结尾 用span进行过滤即可拿到整个处理的相关日志。
-- 👇 harlanc: 我写的有误,我写的线程指的就是协程,启动第一个协程做标记,此协程的子孙协程都使用和做标记的协程相同的traceID, 协程被窃取到其它线程,协程的父子关系不会变吧,这么做的目的就是在服务端的一个session处理能够通过traceID过滤出来所有相关日志,c++的log4cxx有此功能
-- 👇 yuanyan3060: tokio多线程运行时有任务窃取,你的协程任务可能移动到其他线程,你这个需求无法按字面意思实现。
我写的有误,我写的线程指的就是协程,启动第一个协程做标记,此协程的子孙协程都使用和做标记的协程相同的traceID, 协程被窃取到其它线程,协程的父子关系不会变吧,这么做的目的就是在服务端的一个session处理能够通过traceID过滤出来所有相关日志,c++的log4cxx有此功能
tokio多线程运行时有任务窃取,你的协程任务可能移动到其他线程,你这个需求无法按字面意思实现。
评论区
写评论java 里面有个东西叫ThreadLocal 一般用这个去做,跨服务RPC传递通常用header或者隐式的参数传递 然后同一个jvm内用ThreadLocal传递。
github.com/shanliu/lsys 这个老哥说的感觉比较靠谱,可以研究研究
--
👇
omega: 我的做法是,用tokio::task_local定义线程局部变量。在请求入口处生成id,在打印log的时候获取id,遇到tokio::spawn就自己写一个spawn,把id传递下去。处理并不理想,不过将就用,不过不能保证别人一定不用原生的tokio::spawn。
我的做法是,用tokio::task_local定义线程局部变量。在请求入口处生成id,在打印log的时候获取id,遇到tokio::spawn就自己写一个spawn,把id传递下去。处理并不理想,不过将就用,不过不能保证别人一定不用原生的tokio::spawn。
tracing 开始处理时 用span 到结尾 用span进行过滤即可拿到整个处理的相关日志。
--
👇
harlanc: 我写的有误,我写的线程指的就是协程,启动第一个协程做标记,此协程的子孙协程都使用和做标记的协程相同的traceID, 协程被窃取到其它线程,协程的父子关系不会变吧,这么做的目的就是在服务端的一个session处理能够通过traceID过滤出来所有相关日志,c++的log4cxx有此功能
--
👇
yuanyan3060: tokio多线程运行时有任务窃取,你的协程任务可能移动到其他线程,你这个需求无法按字面意思实现。
我写的有误,我写的线程指的就是协程,启动第一个协程做标记,此协程的子孙协程都使用和做标记的协程相同的traceID, 协程被窃取到其它线程,协程的父子关系不会变吧,这么做的目的就是在服务端的一个session处理能够通过traceID过滤出来所有相关日志,c++的log4cxx有此功能
--
👇
yuanyan3060: tokio多线程运行时有任务窃取,你的协程任务可能移动到其他线程,你这个需求无法按字面意思实现。
tokio多线程运行时有任务窃取,你的协程任务可能移动到其他线程,你这个需求无法按字面意思实现。