Node.js 로그와 트레이스 상호 연관 (Correlating Node.js Logs and Traces)
Node.js 애플리케이션의 로그에 트레이스 ID를 주입해 Datadog에서 로그와 트레이스를 연결하는 방법을 안내해요.
출처: 문서
본문
자동 주입
구조화된 애플리케이션 로거를 사용할 때 bunyan, pino, winston에 대해 자동 트레이스 ID 주입을 활성화해요.
이전 트레이서 버전의 경우 DD_LOGS_INJECTION=true 환경 변수로 또는 SDK를 직접 구성해 주입을 활성화할 수 있어요:
// 이 줄은 로거를 가져오기 전에 와야 해요.
const tracer = require('dd-trace').init({
logInjection: false
});
아직 하지 않았다면 Node.js 트레이서를 DD_ENV, DD_SERVICE, DD_VERSION으로 구성해요. 이렇게 하면 env, service, version을 추가하는 데 최상의 경험이 제공돼요 (자세한 내용은 Unified Service Tagging 참조).
참고: 자동 주입은 JSON으로 형식화된 로그에서만 작동해요.
Winston과 Express를 사용한 예시
Winston을 Express와 함께 사용하는 예시는 다음과 같아요:
// 먼저 tracer 초기화
require('dd-trace').init({ logInjection: true });
const express = require('express');
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
level: 'info',
format: format.json(), // 자동 주입에 JSON 필수
transports: [new transports.Console()]
});
const app = express();
app.get('/hello', (req, res) => {
logger.info('hello world');
// dd.trace_id & dd.span_id가 자동으로 추가됨
res.json({ ok: true });
});
const port = process.env.PORT || 3000;
app.listen(port, () => logger.info(`listening on ${port}`));
그러면 다음 형식의 로그가 반환돼요:
{"dd":{"service":"minimal-nodejs-datadog-log-injection","span_id":"8985025821692657638","trace_id":"68c2114800000000669b6b6b2aaf59c9","version":"1.0.0"},"level":"info","message":"hello world"}
수동 주입
자동 주입을 지원하지 않는 로깅 라이브러리를 사용하지만 JSON 형식을 사용한다면 코드에서 직접 수동 주입을 할 수 있어요.
기본 로거로 console을 사용하는 예시:
const tracer = require('dd-trace');
const formats = require('dd-trace/ext/formats');
class Logger {
log(level, message) {
const span = tracer.scope().active();
const time = new Date().toISOString();
const record = { time, level, message };
if (span) {
tracer.inject(span.context(), formats.LOG, record);
}
console.log(JSON.stringify(record));
}
}
module.exports = Logger;