
github实现链接https://github.com/wangbhan/LogMiddleWare1.概况日志现在不全有些项目有有些项目缺失现在想做一个统一的、全链路追踪的SDK来潜入到每个项目中把日志进行格式化同时可以兼容原有的日志系统。2.整体思路采用OpenTelemetry Sanic 中间件SDK的方式来实现日志的嵌入功能实现主要是采用OpenTelemetry的span进程级别隔离和context的contextvar线程级别隔离 - 具体可以参考https://www.yuque.com/lariyufengdaixiaocongban/ztbnsd/uznfesr1hzwaidgp来实现日志定义格式如下字段位宽编码格式来源根请求默认值trace_id128-bit32位小写十六进制字符串链路入口处由 OTel SDK 随机生成跨服务调用时从 traceparent Header 继承随机生成span_id64-bit16位小写十六进制字符串每个新 Span 创建时由 OTel SDK 随机生成随机生成parent_span_id64-bit16位小写十六进制字符串从当前 Span 的父 Span 中取得若为根 Span 则无父全零传递时采用http header中的traceparent具体格式如下版本固定为 00- trace_id32位 hex- span_id16位 hex- 追踪标志01 表示采样采用Sanic框架中间件的方式来封装整体架构设计如下如果要适配其他框架需要做改动模块文件职责配置模块config.py定义TraceConfig数据类统一管理服务名、导出方式、日志格式等所有参数中间件模块middleware.pySanicTraceMiddleware核心类在每个 HTTP 请求前后自动创建/结束 Span传播模块propagation.py从入站请求头提取父上下文向出站请求头注入 traceparent日志集成模块logging_integration.pyTraceContextFilter日志过滤器自动向每条日志记录注入追踪字段提供者与导出模块provider.py/exporters.py初始化全局单例 TracerProvider管理多种 Span 导出器具体实现主要是在本SDK的middleware中其中主要是做一个中间件请求的拦截器将信息从请求头中提取如果没有则自己生成再注入到请求头中并且在请求响应出来之后需要将contextvar中存储的span信息清除