로그를 시각화하고 중앙에서 모니터링하려는 목적에서 Elasticsearch, Kibana을 사용한 로그 수집 및 시각화 시스템을 구축하려고 한다. 이를 위해, Spring 서버에서 생성된 로그를 통일화하여 ELK 시스템에 전송하는 두 가지 방법을 고려하였다.
방법 1: Spring → Logstash TCP 직결
- Spring 애플리케이션에서 생성된 로그를 Logback을 사용하여 직접 TCP를 통해 Logstash로 전송하고, Logstash는 해당 로그를 받아 Elasticsearch에 삽입하는 방식
- 구성:
- Spring에서 생성된 로그는 logback.xml 또는 logback-spring.xml에서 설정된대로 TCP를 통해 Logstash에 전달
- Logstash는 TCP로 받은 로그를 처리하고, 이를 JSON 형식으로 변환한 후 Elasticsearch에 전송
- Kibana는 Elasticsearch의 로그 데이터를 시각화하여 대시보드로 제공
- 장점:
- 실시간 처리: 로그가 생성되면 즉시 Logstash를 통해 Elasticsearch로 전송되어 빠르게 시각화 가능합니다.
- 중앙 집중식 처리: 모든 로그가 Logstash를 거쳐 Elasticsearch로 집합되므로, 로그 전처리 및 변환이 용이합니다.
- 단점:
- Spring 애플리케이션의 부하: TCP 전송을 직접 처리하게 되면 Spring 애플리케이션의 성능에 어느 정도 영향을 끼칠 수 있다.
- Logstash 의존성: Logstash가 항상 온라인 상태여야 하며, 장애가 발생하면 로그 전송에 차질이 생길 수 있다.
방법 2 : Spring → 파일(JSON) → 라즈베리에서 수집 (Filebeat/Fluent Bit)
- Spring 애플리케이션에서 로그를 파일로 기록하고, 이 파일을 Filebeat 또는 Fluent Bit와 같은 경량 로그 수집기가 Elasticsearch로 전송하는 방식
- 구성:
- Spring 애플리케이션은 JSON 형식으로 로컬에 로그를 기록
- Filebeat 또는 Fluent Bit를 사용해 파일을 주기적으로 모니터링하고, 변경 사항이 발생하면 해당 로그 파일을 읽어 Elasticsearch로 전송
- Kibana는 Elasticsearch의 로그 데이터를 시각화하여 대시보드로 제공
방법 2 선택 이유
1. MSA (Microservice Architecture) 확장에 유리
- MSA 환경에서는 서비스가 계속해서 추가되고 변경되어 새로운 서비스가 추가될 때마다 동일한 로그 수집 방식을 유지하는 것이 중요
- 방법 2에서는 Spring 애플리케이션이 로그를 로컬 파일로 기록하고, Filebeat 또는 Fluent Bit가 해당 파일을 수집하여 Elasticsearch로 전송하기 때문에, 새로운 서비스가 추가되어도 기존의 로그 수집 패턴을 그대로 사용할 수 있다.
- 모든 서비스가 동일한 경로를 사용하도록 맞추면, 수집기는 해당 경로에서 모든 로그를 자동으로 수집
2. 네트워크 장애에 강한 안정성
- 로그를 로컬 파일에 저장하고, Filebeat나 Fluent Bit가 이를 모니터링하는 방식은 네트워크가 일시적으로 끊어져도 로그를 잃지 않도록 버퍼링 및 재전송 기능을 제공
- Elasticsearch나 네트워크가 잠시 멈추더라도, 수집기는 로컬에 저장된 로그를 일시적으로 버퍼링한 후, 네트워크가 복구되면 자동으로 재전송하므로 로그 유실을 최소화하는 데 매우 효과적
3. 서비스의 독립성과 유연성 증가
- Spring 애플리케이션은 로컬 파일에 로그를 기록하고, 로그를 수집기가 가져가서 전송하는 방식은 비동기적으로 이뤄지므로 각 서비스가 독립적으로 로그를 처리
- 각 서비스는 로컬 파일 시스템만 관리하면 되기 때문에 다른 서비스와의 종속성을 줄이고, 독립적인 로그 관리가 가능
FileBeat 설치
https://www.elastic.co/kr/downloads/beats/filebeat
Download Filebeat | Elastic
Download Filebeat, the open source data shipper for log file data that sends logs to Logstash for enrichment and Elasticsearch for storage and analysis.
www.elastic.co
AWS에 FileBeat 설치 후 코드
filebeat.yml 파일
filebeat.inputs:
- type: filestream
id: info-logs
enabled: true
paths:
- C:/app/logs/info/application-info.log
fields:
log_level: info
fields_under_root: true
parsers:
- ndjson:
target: ""
add_error_key: true
- type: filestream
id: warn-logs
enabled: true
paths:
- C:/app/logs/warn/application-warn.log
fields:
log_level: warn
fields_under_root: true
parsers:
- ndjson:
target: ""
add_error_key: true
- type: filestream
id: error-logs
enabled: true
paths:
- C:/app/logs/error/application-error.log
fields:
log_level: error
fields_under_root: true
parsers:
- ndjson:
target: ""
add_error_key: true
setup.ilm.enabled: false
setup.template.enabled: false
setup.template.name: "spring-logs"
setup.template.pattern: "spring-logs-*"
output.elasticsearch:
hosts: ["http://:9200"]
index: "spring-logs-%{+yyyy.MM.dd}"
첫 번째 테스트 명령 입력 시 Config OK가 나온다면 통과
./filebeat.exe test config
두 번째 테스트 명령 입력 시
./filebeat.exe test output
이런 결과가 나오면 통과
parse url... OK
connection...
parse host... OK
dns lookup... OK
addresses: xxx.xxx.xxx.xxx
dial up... OK
TLS... WARN secure connection disabled
talk to server... OK
version: 8.13.4
윈도우 백그라운드로 filebeat 실행 명령어
Start-Process -FilePath "C:\Users\Desktop\filebeat\filebeat.exe" `
-ArgumentList "-c", "filebeat.yml" `
-WindowStyle Hidden
로그가 ELK로 전송이 되었다면 인덱스가 생성 되었는지 명령어로 확인 가능
curl "http://localhost:9200/_cat/indices?v" | grep spring

'Infra > LogBack' 카테고리의 다른 글
| 라즈베리파이에 Loki + Grafana로 로그 수집 시스템 구축하기 (0) | 2025.12.22 |
|---|---|
| Spring Boot + Logback 구조적 JSON 로그 만들기 (Logging - 2) (0) | 2025.11.29 |
| 스프링 로그 분석 환경 구축 Elasticsearch + Kibana 설치 (Logging - 1) (0) | 2025.11.21 |