Spring Boot 로그 중앙화: Logback과 ELK 연동
Spring Boot에서 Logback을 통해 JSON 로그를 생성하고 ELK(Logstash·Elasticsearch·Kibana)로 연동해 로그 중앙화를 구현하는 구성과 운영 고려사항 설명
목차
개요
애플리케이션 로그를 한곳에서 수집하면 문제 탐지와 분석이 쉬워진다. 이 글에서는 Spring Boot 애플리케이션에서 Logback 설정을 통해 구조화된 로그를 만들고, Logstash 또는 Filebeat를 거쳐 Elasticsearch로 전송하는 전반적 흐름을 다룬다. 초보자도 이해할 수 있도록 핵심 설정과 예제를 제시한다.
왜 로그 중앙화가 필요한가
장점
- 장애 원인 추적의 용이성
- 서비스 전반의 로그 통합 검색
- 시계열 기반 분석 및 시각화
중심 고려사항
- 로그 포맷의 일관성
- 전송 방식(TCP/파일/HTTP)
- 인덱스 관리 및 보안
아키텍처 개요
일반적인 흐름은 다음과 같다.
- Spring Boot(Logback) → JSON 로그 생성
- 로그 전송: Logstash TCP/Beats(File) → Logstash 파이프라인
- Elasticsearch에 색인
- Kibana에서 검색 및 대시보드
이 방식은 spring boot logback 설정 과 spring boot elk 연동에 적합하다.
Logback 설정 예제
구조화된 로그를 위해 logstash-logback-encoder를 사용한다. 아래 예제는 TCP로 Logstash에 전송하는 appender와 JSON 파일에 쓰는 appender를 함께 보여준다.
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destinations>
<destination>logstash.example.local:5000</destination>
</destinations>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.json.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="JSON_FILE" />
</root>
</configuration>
설명
- LogstashTcpSocketAppender: 애플리케이션에서 Logstash로 직접 전송
- LogstashEncoder: JSON 형태의 구조화된 로그 생성
- JSON_FILE: Filebeat로 수집할 때 유용한 파일 기반 출력
Spring Boot 설정 (application.yml)
logging:
level:
root: INFO
com.example: DEBUG
file:
name: logs/app.log
application.yml은 로그 레벨 기본값을 설정한다. 실제 전송은 logback 설정에서 제어된다.
Logstash 파이프라인 예시
Logstash는 입력에서 JSON을 파싱해 Elasticsearch로 보낸다. 간단한 파이프라인 예시는 다음과 같다.
input {
tcp {
port => 5000
codec => json
}
beats {
port => 5044
}
}
filter {
if [log][logger] {
mutate { rename => { "@timestamp" => "timestamp" } }
}
}
output {
elasticsearch {
hosts => ["http://es-cluster:9200"]
index => "app-logs-%{+YYYY.MM.dd}"
}
}
Filebeat로 로그 수집하기
파일 기반 수집을 선호하면 Filebeat를 사용한다. JSON 모드를 활성화하면 구조화된 필드를 유지할 수 있다.
filebeat.inputs:
- type: log
paths:
- /var/app/logs/*.json
json.keys_under_root: true
json.add_error_key: true
output.logstash:
hosts: ["logstash.example.local:5044"]
Kibana에서 확인과 시각화
- 인덱스 패턴 생성: app-logs-*
- 필드 유형 확인: timestamp, level, logger, message, traceId 등
- 대시보드 구성: 에러율, 응답 시간(로그에 포함 시), 서비스별 로그량
운영 고려사항
로그 포맷과 필드
일관된 필드 설계가 중요하다. 최소한 timestamp, level, thread, logger, message, exception, service, traceId를 포함하면 검색과 연계가 쉬워진다.
성능과 비용
- JSON 로그는 텍스트보다 크다. 저장 비용 고려
- 샘플링이나 로그 레벨 조정으로 전송량 관리
보안과 접근제어
로그에 민감한 정보가 포함되지 않도록 주의한다. 전송 중 TLS 적용과 Elasticsearch 접근 제어 설정이 필요하다.
맺음말
위 구성은 로그 중앙화 spring boot 환경에서 흔히 쓰이는 패턴이다. spring boot logback 설정을 통해 구조화된 로그를 만들고, spring boot elk 연동으로 수집·분석하면 운영 효율성이 높아진다. 실제 환경에서는 인덱스 수명 주기, 권한, 샘플링 정책을 추가로 설계할 필요가 있다.