VM(Virtual Machine) 기반의 아웃터 아키텍처(Outer Architecture)에서 실행되는 서비스의 로그를 수집하기 위한 설정 가이드

MSA(Microservices Architecture) 환경에서 컨테이너 기반(K8s)이 아닌, **VM(Virtual Machine) 기반의 아웃터 아키텍처(Outer Architecture)**에서 실행되는 서비스의 로그를 수집하기 위한 설정 가이드입니다.

핵심 구성 요소:

  1. Source: VM 내 Application (Log 파일 생성)

  2. Collector: VM에 설치된 OpenTelemetry Collector (Contrib 버전 권장)

  3. Destination: OpenSearch


1. 전제 조건 및 아키텍처 흐름

  • 흐름: App (VM) -> Log File (/var/log/…) -> OTel Collector (Filelog Receiver) -> OpenSearch Exporter -> OpenSearch

  • Application: 로그를 파일(예: app.log)로 떨어뜨리도록 설정되어 있어야 합니다. (가능하면 JSON 포맷 권장)

  • Network: VM에서 OpenSearch 포트(기본 9200)로 아웃바운드 통신이 가능해야 합니다.


2. OpenTelemetry Collector 설치 (VM)

VM 환경에서는 로그 수집(Filelog receiver) 및 OpenSearch 전송 기능을 포함하는 otelcol-contrib 배포판을 사용하는 것이 좋습니다.

Linux (RPM/DEB) 설치 예시:

Bash

# RPM (RedHat/CentOS/Amazon Linux)
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.88.0/otelcol-contrib_0.88.0_linux_amd64.rpm
sudo rpm -ivh otelcol-contrib_0.88.0_linux_amd64.rpm

# DEB (Ubuntu/Debian)
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.88.0/otelcol-contrib_0.88.0_linux_amd64.deb
sudo dpkg -i otelcol-contrib_0.88.0_linux_amd64.deb

(버전은 최신 안정 버전을 확인하여 변경하십시오)


3. OpenTelemetry 설정 (config.yaml)

보통 /etc/otelcol-contrib/config.yaml 위치에 설정 파일이 존재합니다. 아래 내용을 작성합니다.

주요 설정 포인트

  1. receiver/filelog: 로그 파일을 읽어들입니다.

  2. processors: 로그에 메타데이터(호스트명, 서비스명)를 추가하고 배치 처리를 합니다.

  3. exporter/opensearch: OpenSearch로 데이터를 전송합니다.

Yaml

receivers:
  filelog:
    include:
      - /var/log/myapp/*.log  # 수집할 로그 파일 경로
    start_at: end             # 시작 시 파일 끝부터 수집 (기존 로그 중복 방지)
    include_file_name: true   # 파일명을 속성에 추가
    # 멀티라인 설정 (Java Stacktrace 등 처리 필요 시)
    multiline:
      line_start_pattern: '^\d{4}-\d{2}-\d{2}' # 날짜로 시작하는 라인을 로그의 시작으로 인식
    operators:
      # JSON 로그라면 파싱 (일반 텍스트라면 이 부분 제거 가능)
      - type: json_parser
        timestamp:
          parse_from: time
          layout: '%Y-%m-%dT%H:%M:%S.%LZ'

processors:
  # 배치 처리 (성능 최적화)
  batch:
    send_batch_size: 1000
    timeout: 10s

  # 리소스 정보 감지 (Hostname, OS 등)
  resourcedetection:
    detectors: [system]
    timeout: 2s
    override: false

  # 서비스 식별을 위한 태그 추가 (MSA에서 매우 중요)
  resource:
    attributes:
      - key: service.name
        value: "my-payment-service"  # 해당 VM에서 도는 서비스명
      - key: deployment.environment
        value: "production"
        action: insert

exporters:
  opensearch:
    http:
      endpoint: "https://opensearch.example.com:9200" # OpenSearch 주소
      # 인증 설정 (Basic Auth 예시)
      auth:
        authenticator: basic_auth
      # TLS 설정 (사설 인증서 사용 시 insecure: true 혹은 ca_file 지정)
      tls:
        insecure: false
        ca_file: /etc/otelcol-contrib/certs/ca.pem
    
    # 인덱스 이름 설정
    logs_index: "logs-application-%{yyyy.MM.dd}"
    
    # 대량 전송 설정
    retry_on_failure:
      enabled: true

extensions:
  # Basic Auth 확장을 정의
  basic_auth:
    client_auth:
      username: "admin"
      password: "admin_password"

service:
  extensions: [basic_auth]
  pipelines:
    logs:
      receivers: [filelog]
      processors: [resourcedetection, resource, batch]
      exporters: [opensearch]

4. 서비스 실행 및 확인

설정 파일을 저장한 후 서비스를 재시작합니다.

Bash

# 설정 파일 유효성 검사 (선택 사항)
# (바이너리 직접 실행으로 에러 로그 확인 가능)
/usr/bin/otelcol-contrib --config=/etc/otelcol-contrib/config.yaml

# 서비스 재시작
sudo systemctl restart otelcol-contrib

# 상태 확인
sudo systemctl status otelcol-contrib

# OTel Collector 자체 로그 확인 (문제 발생 시 디버깅)
journalctl -u otelcol-contrib -f

5. OpenSearch 및 MSA 연동 고려사항

VM(Virtual Machine) 기반의 아웃터 아키텍처(Outer Architecture)에서 실행되는 서비스의 로그를 수집하기 위한 설정 가이드

1) 로그 포맷 (Structured Logging)

MSA 환경에서는 단순 텍스트 로그보다 JSON 로그가 필수적입니다.
Application(예: Spring Boot, Node.js)에서 로그를 JSON으로 출력하도록 설정하십시오.

  • 이유: OpenSearch에서 별도 파싱 없이 필드별 검색(levelclasstrace_id 등)이 가능해집니다.

2) Trace Context 연동 (Traces + Logs)

MSA의 핵심은 분산 추적입니다. Application 로그에 TraceID와 SpanID가 포함되어야 합니다.

  • App 설정: Logback/Log4j2 설정에 %X{traceId} %X{spanId} 패턴을 추가하거나, OTel Java Agent를 사용하여 자동 주입합니다.

  • OTel Collector: JSON 파서를 통해 trace_id 필드가 추출되면, OpenSearch에서 해당 로그와 트레이스를 연결하여 볼 수 있습니다.

3) 인덱스 템플릿 (Index Template)

OpenSearch에 데이터가 들어오기 전에 인덱스 템플릿을 설정하여 데이터 타입을 최적화하는 것이 좋습니다.

  • 예: time 필드는 date 타입으로, http.status_code는 integer로 매핑.

6. 요약

  1. 설치: VM에 otelcol-contrib 설치.

  2. 입력: filelog 리시버로 로그 파일 Tail.

  3. 가공: resource 프로세서로 service.name 태깅 (K8s가 아니므로 수동 지정 필요).

  4. 출력: opensearch 익스포터로 전송.

  5. 보안: TLS 및 Basic Auth 설정 적용.