MSA(Microservices Architecture) 환경에서 컨테이너 기반(K8s)이 아닌, **VM(Virtual Machine) 기반의 아웃터 아키텍처(Outer Architecture)**에서 실행되는 서비스의 로그를 수집하기 위한 설정 가이드입니다.
핵심 구성 요소:
-
Source: VM 내 Application (Log 파일 생성)
-
Collector: VM에 설치된 OpenTelemetry Collector (Contrib 버전 권장)
-
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) 설치 예시:
# 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 위치에 설정 파일이 존재합니다. 아래 내용을 작성합니다.
주요 설정 포인트
-
receiver/filelog: 로그 파일을 읽어들입니다.
-
processors: 로그에 메타데이터(호스트명, 서비스명)를 추가하고 배치 처리를 합니다.
-
exporter/opensearch: OpenSearch로 데이터를 전송합니다.
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. 서비스 실행 및 확인
설정 파일을 저장한 후 서비스를 재시작합니다.
# 설정 파일 유효성 검사 (선택 사항)
# (바이너리 직접 실행으로 에러 로그 확인 가능)
/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 연동 고려사항

1) 로그 포맷 (Structured Logging)
MSA 환경에서는 단순 텍스트 로그보다 JSON 로그가 필수적입니다.
Application(예: Spring Boot, Node.js)에서 로그를 JSON으로 출력하도록 설정하십시오.
-
이유: OpenSearch에서 별도 파싱 없이 필드별 검색(level, class, trace_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. 요약
-
설치: VM에 otelcol-contrib 설치.
-
입력: filelog 리시버로 로그 파일 Tail.
-
가공: resource 프로세서로 service.name 태깅 (K8s가 아니므로 수동 지정 필요).
-
출력: opensearch 익스포터로 전송.
-
보안: TLS 및 Basic Auth 설정 적용.