

在分布式系统中,仅靠报错日志往往无法快速定位问题。我们经常面对“系统没报错,但就是慢”或“偶发错误找不到原因”的情况。本文将介绍如何将日志与分布式追踪(如 Jaeger、OpenTelemetry)结合,基于 traceId 串联整个链路上下游,快速排查服务瓶颈与异常。文章附带可运行的示例代码,适用于 Node.js 与 Spring Boot 应用。
现代系统越来越复杂,一个请求常常会穿越多个服务。传统的日志打印、error 记录虽然必要,但无法提供完整上下文信息。我们需要一种方法,把日志“串”起来,看清每一次调用背后的路径和耗时。
这就引出了两个关键词:日志增强 与 分布式追踪(Tracing)。我们要做的,是在已有日志体系中引入 traceId,打通链路,实现更强的可观测能力。
日志打印往往是局部信息,比如:
[2024-06-01 12:00:01] OrderService: created order 1234但这个订单是怎么来的?从哪个接口发起的?下游库存扣减成功了吗?日志无法回答。
一个请求“变慢”,日志可能没有错误,但我们也不知道哪一步耗时最多。链路追踪能帮我们抓出“慢点”。
TraceId 是分布式追踪系统为一次请求分配的唯一标识。只要服务之间传递这个 ID,我们就可以在日志中追踪整个流程。
常用追踪组件:
通过 TraceId,我们可以做到这样的日志输出:
[traceId=abc123] UserService: received login request
[traceId=abc123] AuthService: token verified
[traceId=abc123] OrderService: created order是不是清晰多了?
npm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node winston// tracing.js
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { ConsoleSpanExporter, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
const sdk = new NodeSDK({
traceExporter: new ConsoleSpanExporter(),
instrumentations: [getNodeAutoInstrumentations()]
});
sdk.start();// logger.js
const { context, trace } = require('@opentelemetry/api');
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.printf(({ level, message }) => {
const span = trace.getSpan(context.active());
const traceId = span ? span.spanContext().traceId : 'unknown';
return `[${level}] [traceId=${traceId}] ${message}`;
}),
transports: [new winston.transports.Console()]
});
module.exports = logger;// index.js
require('./tracing');
const logger = require('./logger');
logger.info('User logged in');做法:
traceId 在 Jaeger 中查看链路做法:
做法:
try...catch 吃掉A:不会明显影响。TraceId 是字符串拼接,日志系统本身 IO 成本更高。
A:建议逐步接入。可先从用户入口服务开始,再串联关键业务服务。
A:大多数 HTTP client 支持自定义 Header,传递 traceparent 即可。
日志只是“看见问题”的起点。只有把日志与链路追踪结合起来,我们才能真正做到**“看清问题”**。通过 TraceId 串联的链路日志,可以:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。