오케스트레이션 환경에서 Winston을 사용하는 Node.js 애플리케이션에 대한 사용자 지정 다중 줄 구문 분석을 지원하도록 1.6.x 로깅 에이전트 사용자 지정하기

이 자습서에서는 사용자 정의 Winston 로깅 라이브러리를 사용하여 Node.js 애플리케이션에 대한 IBM® Cloud Logs 로깅 에이전트 멀티라인 로그 처리를 구성하는 방법을 보여 줍니다. 이 구성은 오케스트레이션 환경(예: IBM Cloud Kubernetes Service 및 Red Hat OpenShift on IBM Cloud )을 위한 구성이며 Helm 을 사용합니다. 이 구성은 스택 추적 및 여러 줄 로그가 IBM Cloud Logs 에서 올바르게 그룹화되도록 합니다.

이 튜토리얼을 사용하려면 IBM Cloud Logs 로깅 에이전트 1.6.0 이상이 필요합니다.

시작하기 전에

이 튜토리얼을 사용하기 전에 다음 정보를 검토하여 로깅 에이전트 및 여러 줄 개념을 이해하세요.

이 튜토리얼에서는 이미 가지고 있다고 가정합니다:

Winston 구성 샘플

Node.js 애플리케이션이 Winston을 사용하며 콘솔에 다음 형식으로 로그한다고 가정해 보겠습니다:

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp({
      format: 'ddd MMM DD YYYY HH:mm:ss.SSS'
    }),
    winston.format.errors({ stack: true }),
    winston.format.printf(({ timestamp, level, message, stack }) => {
      const levelUpper = level.toUpperCase();
      const baseLog = `[${timestamp}] ${levelUpper} [Main] - ${message}`;
      if (stack) {
        return `${baseLog}\n${stack}`;
      }
      return baseLog;
    })
  ),
  transports: [
    new winston.transports.Console()
  ]
});

이 형식은 타임스탬프와 레벨로 시작하는 로그 항목을 생성하며, 오류 스택 추적과 같은 여러 줄의 로그는 타임스탬프 없이 후속 줄에 이어집니다.

Winston은 일반적으로 오류 스택 추적을 포함한 모든 출력을 단일 문자열로 기록하므로 여러 줄 구문 분석기가 필요하지 않은 경우가 많습니다. 그러나 이 예는 포맷터가 여러 줄 로그를 인쇄하는 경우 수행해야 할 작업을 보여 주며, 사용자 지정 형식에 대한 여러 줄 구문 분석에 접근하는 방법을 설명하는 데 도움이 됩니다.

이 구성은 사용자 정의 로그 서식을 사용할 때 여러 줄 로그를 처리하는 방법을 보여주기 위한 예제로 제공됩니다. 애플리케이션에서 다른 구조 또는 로깅 라이브러리를 사용하는 경우, 이를 참조하여 그에 맞는 자체 멀티라인 구문 분석기를 만드세요.

다음을 사용하여 여러 줄 구문 분석 구성 Helm

Helm 을 사용하여 로깅 에이전트 을 배포하는 경우 Helm values.yaml 파일에서 여러 줄 구문 분석을 구성할 수 있습니다.

여러 줄 구문 분석 사용

values.yaml 파일에서 enableMultilinetrue 으로 설정하여 여러 줄 처리를 활성화합니다:

enableMultiline: true

여러 줄 구문 분석기 정의

values.yaml 파일의 additionalMultilineParsers 섹션 아래에 사용자 정의 여러 줄 구문 분석기를 추가합니다.

적절한 로그 그룹화를 위해서는 log4j.xml 파일에 정의된 패턴이 여러 줄 구문 분석기의 정규식과 일치하는 것이 중요합니다.

additionalMultilineParsers:
  - name: multiline-nodejs-winston
    type: regex
    flush_timeout: 500
    rules:
      - state: start_state
        regex: '/^\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] .*$/'
        next_state: cont
      - state: cont
        regex: '/^(?!\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] ).*$/'
        next_state: cont

이 정규식은 각 새 로그 줄이 ddd MMM DD YYYY HH:mm:ss.SSS 형식의 타임스탬프로 시작한다고 가정합니다. 첫 번째 규칙은 타임스탬프가 있는 시작 라인을 캡처하고 연속 상태로 이동합니다. 두 번째 규칙은 타임스탬프로 시작하지 않는 모든 줄을 일치시킵니다.

이 접근 방식은 여러 줄의 로그 행을 IBM Cloud Logs 으로 전달하기 전에 단일 로그 항목으로 그룹화하는 방법을 보여주기 위한 예일 뿐입니다. 같은 목적을 달성하는 방법에는 여러 가지가 있습니다.

전처리기에서 구문 분석기를 적용합니다

multilinePreprocessor 섹션에서 전처리기를 구성하여 구문 분석기를 로그에 적용하세요.

예를 들어, 다음과 같습니다.

multilinePreprocessor:
  - name: multiline
    multiline.parser: multiline-nodejs-winston
    multiline.key_content: log

변경사항을 적용하십시오.

이전 버전의 로깅 에이전트 을 설치하고 클러스터에서 직접 구성 맵을 수정하여 상담원 구성을 업데이트한 경우에는 helm upgrade 명령을 실행하기 전에 클러스터에서 구성 맵의 복사본을 만드세요. 로깅 에이전트 이 업데이트되면 구성 맵의 모든 변경 사항을 덮어씁니다.

values.yaml 파일을 업데이트한 후 배포에서 다음을 실행하여 변경 사항을 적용합니다. 이렇게 하면 필요한 구성이 다시 생성됩니다.

helm upgrade

여러 줄 로그 확인

IBM Cloud Logs 인스턴스에 액세스하여 여러 줄의 항목(예: 스택 추적)이 올바르게 그룹화되었는지 확인합니다.

  1. IBM Cloud Logs 인스턴스에 액세스합니다.

  2. 로그 탐색 로그 아이콘 보기를 사용하여 여러 줄의 항목이 올바르게 그룹화되었는지 확인합니다.