ELK스택과 LGTM 스택
로그 수집과 시각화에 있어 가장 많이 언급되는 두 가지 스택은 ELK(Elasticsearch, Logstash, Kibana) 와 LGTM(Loki, Grafana, Tempo, Mimir) 입니다.
ELK 스택은 로그를 중앙에서 수집하고 색인화하여 Kibana에서 시각화합니다. 그러나 리소스를 많이 사용하는 단점이 있습니다.
LGTM 스택은 Grafana Labs에서 만든 스택으로, Loki를 통해 로그를 수집하고, Grafana에서 시각화합니다. Loki는 로그를 메타데이터 기반으로 저장하므로 리소스 사용이 적고, Prometheus와 잘 연동됩니다.
Mimir은 메트릭 저장 시스템이고, Tempo는 분산 추적 시스템이라 사용하지 않고, 로그 저장 시스템인 Loki와 시각화 서비스인 Grafana를 사용하여 로그 수집 시스템을 만들어 볼 것입니다.
Promtail 지원 만료
이때 Loki로 로그를 보내는 시스템이 필요한데요, 보통 Promtail이 사용되고는 합니다. 그러나 Promtail은 지원이 중단될 예정이고 새롭게 Alloy라는 통합 에이전트가 나왔기에 이를 사용하여 로그를 전송해보고자 합니다.
Alloy
Alloy는 Grafana에서 만든 통합 에이전트입니다. 특징은 다음과 같습니다.
통합 텔레메트리 수집: OTel, Prometheus, Pyroscope, Loki 등 다양한 메트릭, 로그, 트레이스 및 프로파일링 도구에 대한 기본 파이프라인 제공
호환성: OTel collector, Prometheus 에이전트, Promtail과 완벽하게 호환
유연한 배포: 온프레미스, 클라우드 또는 하이브리드 환경 어디에나 배포 가능
리소스 효율성: 프로메테우스 대비 약 1/10 수준의 리소스로 메트릭 수집 가능
Grafana LGTM 스택 지원: Loki(로그), Grafana(시각화), Tempo(트레이스), Mimir(메트릭) 스택과 원활하게 연동
Grafana Alloy 기본 사용 및 Prometheus & Loki 연동(https://hackjsp.tistory.com/78)
로깅 시스템 구축
logback 설정
resources/logback-spring.xml 에 설정을 해줍시다. /var/log/spring을 로그 내보내는 디렉토리로 지정했는데, 이는 그대로 사용해도 되지만 저는 도커를 사용해 해당 경로를 볼륨으로 이어줄 예정입니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
<springProperty scope="context" name="activeProfile" source="spring.profiles.active"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/spring/wibaek.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 매일 로그를 롤링 -->
<fileNamePattern>/var/log/spring/wibaek.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 최근 30일 로그 보관 -->
</rollingPolicy>
<encoder>
<!-- Loki에서 읽기 좋은 logfmt 형식 (간단한 key=value 스타일) -->
<pattern>timestamp=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} level=%-5level thread=%thread logger=%logger{36}
message=%msg%n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
<springProfile name="prod,stage">
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</springProfile>
</configuration>
Alloy 설정
설정은 config.alloy라는 이름의 파일에 작성합니다. 확장자가 alloy로 끝나는 것이 규칙입니다.
저는 설정파일을 /docs/config.alloy 경로에 저장했습니다.
logging {
level = "info"
format = "logfmt"
}
local.file_match "spring_logs" {
path_targets = [{ __path__ = "/var/log/spring/*.log" }] // 서비스 로그 파일 경로
}
loki.source.file "spring_source" {
targets = local.file_match.spring_logs.targets // 위에서 정의한 로그 파일 경로 사용
forward_to = [loki.process.spring_labels.receiver] // 읽은 로그를 처리 단계로 전달
}
loki.process "spring_labels" {
forward_to = [loki.write.grafana_loki.receiver] // 처리된 로그를 Loki로 전송
stage.static_labels {
values = {
"job" = "spring",
"service" = "backend",
}
}
}
loki.write "grafana_loki" {
endpoint {
url = "http://blog.wibaek.com:3100/loki/api/v1/push"
tenant_id = "fake" // Loki 테넌트 ID (싱글 테넌시이기에 fake로 설정)
batch_wait = "1s" // 로그 배치 전송 대기 시간
batch_size = "1MB" // 로그 배치 크기
}
}
docker-compose.yml 설정
version: '3.8'
services:
wibaek-server:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
volumes:
- ./logs:/var/log/spring
alloy:
image: grafana/alloy:latest
container_name: alloy
ports:
- "12345:12345"
volumes:
- ./logs:/var/log/spring
도커 컴포즈 설정을 해줍니다. 이때 볼륨을 잘 연결해주도록 합시다.
Reference
https://grafana.com/docs/alloy/latest/introduction/
Introduction to Grafana Alloy | Grafana Alloy documentation
Introduction to Grafana Alloy Alloy is a flexible, high performance, vendor-neutral distribution of the OpenTelemetry Collector. It’s fully compatible with the most popular open source observability standards such as OpenTelemetry and Prometheus. Alloy f
grafana.com
https://hackjsp.tistory.com/78
Grafana Alloy 기본 사용 및 Prometheus & Loki 연동
1. Grafana Alloy 개요Grafana Agent에 대해 알아보려던 중, 공식 문서에서 경고 문구를 발견하였다. Grafana Labs에서 Grafana Agent를 대체하는 새로운 솔루션인 Grafana Alloy를 발표했다는 내용이었다. 이에 따
hackjsp.tistory.com
[Monitoring] Grafana Alloy로 log, metric 데이터 모니터링하기
1. 시작하며모니터링 환경 구축을 고민하면서 log 지표를 수집하는 방법을 고민했다.metric에는 prometheus라는 간편하면서도 강력한 선택지가 있었기에 큰 고민이 없었지만log 데이터에 대해서는 여
yucori.tistory.com
'인프라 (Infra)' 카테고리의 다른 글
장고 앱 CI/CD, 무중단 배포 구현기 (0) | 2025.04.06 |
---|---|
Azure 기본 IP 주소 vs. 표준 IP 주소 (0) | 2025.04.06 |
컨테이너 레지스트리 비교 (0) | 2025.03.12 |
HeadVer 버저닝 기반 Vercel 자동 배포 구현기 (1) | 2025.03.11 |
EC2 T instance VS M instance 비용 비교 (0) | 2024.04.08 |