Search

[삽질] FluentBit를 활용한 로그 저장 w.S3

Date
2025/03/21
Category
Devops
Tag
Kubernetes
Monitoring
Logging
목차

 개요

AWS EKS를 활용해 프로젝트를 진행하며 로그 관리에 대해 고민이 깊어졌다. 현재 Grafana + Loki를 통해서 로그를 실시간으로 분석하고 있지만, 지속적으로 쌓이는 로그를 장기 보관(Archiving)하기에 비용과 관리 측면에서 어려움을 겪게 되었다.
따라서 효율적인 로그 관리를 위해서 S3 도입에 대해 고려하게 되었다. 로그 수집 도구로는 현재 프로젝트 사이즈와 상황에 맞는 가벽고 효율적인 FluentBit를 도입하기로 결정했다.

 비교

Logstash, Fluent Bit, Fluentd 를 간단하게 비교하자면 다음과 같다:
Logstash
Fluent Bit
Fluentd
경량성
무겁고 리소스 소모가 큼
경량, 저자원 사용
중간 정도의 리소스 소모
속도
느린 처리 속도
빠른 처리 속도
중간 속도
유연성
매우 유연한 플러그인 구조
제한된 필터링 및 변환 기능
매우 유연한 플러그인 구조
사용 용도
복잡한 데이터 처리 및 변환
경량화된 로그 수집 및 전송
로그 수집 및 데이터 파이프라인
통합
Elasticsearch와 강력한 통합
다양한 출력 지원 (S3, Elasticsearch, Kafka)
다양한 출력 및 입력 지원
ELK Stack 을 사용하여 데이터를 시각화 시킬 것이 아닐 뿐더러, 애플리케이션의 단순 로그 수집이 목적이기 때문에 Fluent Bit 를 사용하게 되었다.

 적용

🪏 과정 1: 로그 포맷 변경

애플리케이션의 프레임워크는 Spring Boot 였다. 따라서 로그는 기본적인 Spring Boot 텍스트 포맷을 따랐다.
2025-03-20T23:14:44.274Z INFO 1 --- [cinebox] [ main] cinebox.CineboxApplication : Started CineboxApplication in 48.492 seconds (process running for 52.222) 2025-03-21T02:30:18.709Z INFO 1 --- [cinebox] [io-8080-exec-10] c.domain.auth.controller.AuthController : 로그인 요청 수신: identifier=admin 2025-03-21T02:30:18.711Z INFO 1 --- [cinebox] [io-8080-exec-10] c.domain.auth.service.AuthServiceImpl : 로그인 프로세스 시작: identifier=admin 2025-03-21T02:30:19.106Z INFO 1 --- [cinebox] [io-8080-exec-10] c.domain.auth.service.AuthServiceImpl : 로그인 성공: userId=1, accessToken 생성됨 2025-03-21T02:30:19.135Z INFO 1 --- [cinebox] [io-8080-exec-10] c.domain.auth.controller.AuthController : 로그인 성공: userId=1 2025-03-21T02:30:31.257Z WARN 1 --- [cinebox] [nio-8080-exec-7] c.security.jwt.JwtAuthenticationFilter : 블랙리스트에 등록된 토큰이 접속을 시도합니다. 요청 거부
Plain Text
복사
지금 구조로도 로깅을 할 수 있지만 JSON 로그 포맷으로 변경을 해야했다. 그 이유는 다음과 같다:
구조화된 데이터 처리
Fluent Bit에서 자동 파싱 가능
필드별 검색/분석 용이
메타데이터 보존
로그 레벨, 타임스탬프, 스레드 정보 등이 key-value 형태로 유지
다중 라인 로그 문제 해결
stack trace가 단일 JSON 객체로 처리

🪏 과정 2: FluentBit 설정

Spring Boot JSON 로깅 설정 방법은 의존성을 추가하고, 설정 파일을 수정해주면 된다. 현재 Maven을 사용하기 때문에 maven 에서의 적용을 작성한다.
의존성 추가 (pom.xml)
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>7.4</version> </dependency>
XML
복사
logback-spring.xml 설정
src/main/resources 에 파일을 추가한다.
customFields를 통해 JSON 필드를 추가할 수도 있다. 현재는 prod 환경에서의 로그만 수집하고 있는데 dev 환경까지 적용을 한다면 이를 통해 구분시켜 로그를 확인할 수 있을 것 같다.
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <customFields>{"app":"cinebox","env":"prod"}</customFields> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration>
XML
복사
application.properties 설정
# Logback logging.config=classpath:logback-spring.xml
YAML
복사

 결과 및 회고

결과: 연동 실패 프로젝트 마감 기한과 우선순위 조정으로 인해 S3에 로그가 최종적으로 적재되는 것을 확인하지 못했다. 현재는 Loki를 통해 기본적인 시각화까지만 완료된 상태이다.
원인 분석 프로젝트 종료로 디버깅을 끝까지 수행하진 못했지만, 복기해보면 다음과 같은 원인이었을 가능성이 있다.
1.
IRSA(IAM Roles for Service Accounts) 권한 누락: EKS 파드(Fluent Bit)가 S3에 PutObject를 할 수 있는 권한 설정이 미흡했을 수 있다.
2.
Buffer/Flush 설정 미흡: 메모리 버퍼가 차기 전에 전송되거나, 청크(Chunk) 사이즈 설정이 맞지 않아 전송이 트리거되지 않았을 수 있다.
3.
S3 Key 포맷 및 파티셔닝: YEAR/MONTH/DAY 형식의 경로 지정이나 포맷 설정에서 에러가 발생했을 수 있다.
향후 개선 방향 다음 기회가 된다면 '최소 기능 구현'부터 접근해야겠다. 복잡한 파싱이나 포맷팅을 배제하고, Fluent Bit 로그(stdout)를 먼저 확인하여 권한 에러를 잡은 뒤, S3에 단 한 줄이라도 텍스트가 저장되는 것을 먼저 성공시키는 방식(Iterative approach)으로 진행해야 전체적인 완성도가 올라갈 것 같다.