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

Node.js 로그 수집 (Log Collection)

원문 보기 위키 갱신

로그를 Datadog로 보내려면 파일에 로그를 남기고 Datadog Agent로 그 파일을 tail 하세요. Node.js 애플리케이션에서 로그를 남기려면 Winston, Bunyan, Pino 같은 로깅 라이브러리를 사용해요. 이 페이지의 예시는 Winston을 사용합니다.

Winston은 NPM에서 사용할 수 있어요. 시작하려면 코드에 의존성을 추가하세요:

npm install --save winston

package.json에 해당 의존성이 추가돼요:

{
  "name": "...",

  //...
  "dependencies": {
    //...
    "winston": "x.y.z",
    //...
  }
}

출처: 문서

본문

파일에 로그 남기기 (Log to a file)

부트스트랩 파일이나 코드에서 로거를 다음과 같이 선언하세요:

{% tab title="Winston 3.0" %}


const { createLogger, format, transports } = require('winston');

const logger = createLogger({
  level: 'info',
  exitOnError: false,
  format: format.combine(format.timestamp(), format.json()),
  transports: [
    new transports.File({ filename: `${appRoot}/logs/<FILE_NAME>.log` }),
  ],
});

module.exports = logger;

// Example logs
logger.log('info', 'Hello simple log!');
logger.info('Hello log with metas',{color: 'blue' });

{% /tab %}

{% tab title="Winston 2.0" %}

var winston = require('winston');

var logger = new (winston.Logger)({
    transports: [
        new (winston.transports.File)({
            name: '<LOGGER_NAME>',
            filename: '<FILE_NAME>.log',
            json: true,
            level: 'info'
        })
    ]
});

// Example logs
logger.log('info', 'Hello simple log!');
logger.info('Hello log with metas',{color: 'blue' });

{% /tab %}

<FILE_NAME>.log 파일의 내용을 확인해 Winston이 JSON으로 로그를 남기는지 확인해 보세요:

{"level":"info","message":"Hello simple log!","timestamp":"2015-04-23T16:52:05.337Z"}
{"color":"blue","level":"info","message":"Hello log with metas","timestamp":"2015-04-23T16:52:05.339Z"}

Datadog Agent 설정하기 (Configure your Datadog Agent)

로그 수집이 활성화된 후 사용자 지정 로그 수집을 설정해 로그 파일을 tail 하여 새 로그를 Datadog로 보내세요.

  1. Agent 설정 디렉터리의 conf.d/에 nodejs.d/ 폴더를 만드세요.
  2. nodejs.d/에 다음 내용으로 conf.yaml 파일을 만드세요:
init_config:

instances:

##Log section
logs:

  - type: file
    path: "<FILE_NAME_PATH>.log"
    service: <SERVICE_NAME>
    source: nodejs
    sourcecategory: sourcecode

Agent를 재시작하세요. Agent의 status 하위 명령을 실행하고 Checks 섹션에서 nodejs를 찾아 로그가 Datadog에 성공적으로 제출되는지 확인하세요. 로그가 JSON 형식이면 Datadog가 로그 메시지를 자동으로 파싱하여 로그 속성을 추출해요. Log Explorer를 사용해 로그를 확인하고 문제를 해결하세요.

로그와 트레이스 간 서비스 연결하기 (Connect your service across logs and traces)

이 애플리케이션에 APM이 활성화되어 있다면 APM Node.js 지침에 따라 로그와 트레이스를 연결하세요. 이렇게 하면 trace ID, span ID, env, service, version이 로그에 자동으로 추가돼요.

참고: Datadog SDK가 로그에 service를 주입하면 Agent 설정에 설정된 값을 덮어써요.

Agent 없이 로깅하기 (Agentless logging)

호스트에 Agent를 설치하지 않고도 애플리케이션에서 Datadog로 로그를 스트리밍할 수 있어요. 다만 Datadog는 로그를 전달할 때 네이티브 연결 관리를 제공하는 Agent 사용을 권장합니다.

Winston HTTP transport를 사용해 Datadog Log API로 로그를 직접 보내세요. 부트스트랩 파일이나 코드에서 로거를 다음과 같이 선언하세요:

const { createLogger, format, transports } = require('winston');

const httpTransportOptions = {
  host: 'http-intake.logs.<YOUR_DATADOG_SITE>',
  path: '/api/v2/logs?dd-api-key=<DATADOG_API_KEY>&ddsource=nodejs&service=<APPLICATION_NAME>',
  ssl: true
};

const logger = createLogger({
  level: 'info',
  exitOnError: false,
  format: format.json(),
  transports: [
    new transports.Http(httpTransportOptions),
  ],
});

module.exports = logger;

// Example logs
logger.log('info', 'Hello simple log!');
logger.info('Hello log with metas',{color: 'blue' });

참고: 커뮤니티에서 지원하는 Datadog Transport도 사용할 수 있어요.

문제 해결 (Troubleshooting)

애플리케이션에서 DNS 조회 오류가 발생한다면 logstash 예외가 잡히지 않았기 때문일 수 있어요. 다음과 같이 핸들러를 추가해야 합니다:

var logstash = new winston.transports.Logstash({ ... });
logstash.on('error', function(err) {
    console.error(err); // replace with your own functionality here
});

max_connect_retries 매개변수가 1로 설정되지 않았는지 확인하세요(기본값은 4입니다).

더 알아보기 (Learn more)