본문 바로가기
WIKI 기술 지식 베이스

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;

더 알아보기 (Learn more)