✅ 개요
지금까지 PLG 스택에 대한 전반적인 구성은 완료했다.
하지만 어디까지나 개발환경에서 테스트 한 것이고 실제 운영환경에 배포를 해야한다.
✅ Promtail 배포
Loki와 Grafana는 Grafana Cloud를 이용하고 있었기 때문에 별도의 배포과정이 필요가 없다.
단, 애플리케이션 쪽에서 로그를 수집하는 Promtail은 운영환경에 별도로 배포를 해주어야 한다.
0️⃣ 배포 구조
- 스프링부트 서버에서 발생한 로그를 내부 디렉토리에 저장한다.
- Docker 볼륨 기능을 통해 스프링 부트 컨테이너 로그 디렉토리와 EC2 내부 로그 디렉토리를 동기화한다.
- 이번엔 EC2 인스턴스와 Promtail 컨테이너의 로그 디렉토리 간에 볼륨을 설정해 로그 파일을 동기화 한다.
- Promtail은 로그 디렉토리로부터 로그를 수집 및 전처리한다.
- Loki로 로그를 전송한다.
1️⃣ promtail config 파일 작성
server:
http_listen_port: 0
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: <https://${LOKI_USERNAME}:${LOKI_PASSWORD}@logs-prod-030.grafana.net/loki/api/v1/push>
scrape_configs:
- job_name: logs # 통합된 job 이름
static_configs:
- targets:
- localhost
labels:
job: logs
log_level: info # info 레벨 라벨 추가
__path__: /var/log/info/info-*.log
- targets:
- localhost
labels:
job: logs
log_level: warn # warn 레벨 라벨 추가
__path__: /var/log/warn/warn-*.log
- targets:
- localhost
labels:
job: logs
log_level: error # error 레벨 라벨 추가
__path__: /var/log/error/error-*.log
pipeline_stages:
# traceId 추출 (모든 로그에서 추출 가능)
- regex:
expression: '\\[traceId=(?P<traceId>[^\\]]+)\\]'
# HTTP Request 관련 라벨 추출 (HTTP Request 메시지에서만 추출)
- regex:
expression: 'HTTPMethod=(?P<HTTPMethod>[A-Z]+) Path=(?P<Path>/\\S+) from IP=(?P<IP>[0-9a-fA-F:]+)'
# ExecutionTime 추출 (ExecutionTime이 있는 메시지에서만 추출)
- regex:
expression: 'ExecutionTime=(?P<ExecutionTime>\\d+)ms'
# 라벨 설정
- labels:
traceId: traceId
HTTPMethod: HTTPMethod
Path: Path
IP: IP
ExecutionTime: ExecutionTime
개발환경에서 테스트 할 때도 Promtail은 개발환경에서 Docker로 띄웠었기 때문에 해당 파일은 별도로 수정할 부분이 없다.
운영 중인 EC2에 작성해주었다.
2️⃣ promtail Docker Compose 파일 작성
services:
promtail:
image: grafana/promtail:latest
container_name: promtail
volumes:
- /home/ubuntu/promtail:/etc/promtail
- /home/ubuntu/log:/var/log
environment:
- LOKI_USERNAME
- LOKI_PASSWORD
command: -config.file=/etc/promtail/config.yml -config.expand-env=true
EC2 내부의 /log 디렉토리와 Promtail 내부의 /log 디렉토리 간의 볼륨을 설정하였다.
3️⃣ Spring boot Docker Compose 파일 수정
services:
blue:
image: <spring boot 이미지>
container_name: blue-server
volumes:
- /home/ubuntu/log:/log
ports:
- "8081:8080"
environment:
# 환경변수생략..
EC2 내부의 /log 디렉토리와 컨테이너 내부의 /log 디렉토리 간의 볼륨을 설정하였다.
🔬 결과
Spring Boot 컨테이너 내부 로그
docker exec -it <spring boot 컨테이너> bash #컨테이너 접속
cat /log/info/<로그파일> # 로그 파일 보기
EC2 내부 로그
cat /log/info/<로그파일> # 로그 파일 보기
Promtail 컨테이너 내부 로그
docker exec -it <promtail 컨테이너> bash #컨테이너 접속
cat /var/log/info/<로그파일> # 로그 파일 보기
Grafana
정상적으로 배포가 되었다.
'데브코스 > 실습 & 프로젝트' 카테고리의 다른 글
[최종 프로젝트] Jira 도입기 ( + 회고) (2) | 2024.12.27 |
---|---|
[2-3차 프로젝트] Prometheus 도입 (5) | 2024.11.05 |
[2-3차 프로젝트] Grafana 알림 기능 사용하기 (0) | 2024.11.05 |
[2-3차 프로젝트] Grafana Loki: logfmt와 Promtail 라벨링 성능 비교 (0) | 2024.11.03 |
[2-3차 프로젝트] 로깅 시스템 개선: 중앙 집중화 로깅 - PLG 스택 (1) | 2024.11.03 |