AWS EC2에서 운영 중인 서버의 로그를 효율적으로 수집하고 모니터링하기 위해 Promtail, Loki, Grafana를 직접 설치하고 구성해본 경험을 공유합니다.
✨ 도입 배경
로그를 실시간으로 수집하고 검색 가능한 형태로 저장하고 싶었습니다. 하지만 ELK 스택은 무겁고 복잡하게 느껴졌고, Grafana Labs에서 만든 Loki + Promtail 조합이 더 가볍고 설정도 쉬워 보여 선택했습니다.
⚖️ 구성도
[EC2 서버 로그] → Promtail → Loki → Grafana
- Promtail: EC2 내에서 로그 파일을 수집하는 역할 (tail)
- Loki: 수집된 로그를 저장/검색 가능하게 하는 백엔드
- Grafana: Loki에 저장된 로그를 시각화/검색하는 UI
📁 Promtail 설치 및 설정
1. Promtail 설치
wget https://github.com/grafana/loki/releases/download/v2.9.4/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip
chmod +x promtail-linux-amd64
mv promtail-linux-amd64 /usr/local/bin/promtail
2. promtail.yaml 설정 예시
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /opt/promtail/positions.yaml
clients:
- url: http://localhost:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets: [localhost]
labels:
job: varlogs
__path__: /var/log/*log
- job_name: example
static_configs:
- targets: [localhost]
labels:
job: example
env: live
__path__: /opt/example/logs/server-*.json
pipeline_stages:
- regex:
expression: '.*/server-(?P<component>[^/]+)\\.json'
source: filename
- json:
expressions:
ts: time
lvl: level
msg: message
thread: thread
- timestamp:
source: ts
format: RFC3339
- labels:
lvl:
thread:
component:
- output:
source: msg
3. promtail user 계정 생성 및 권한 설정
sudo useradd --no-create-home --shell /usr/sbin/nologin promtail
sudo usermod -aG adm promtail
/var/log 로그 파일을 읽기 위해 adm 그룹에 추가해야 함
4. systemd 서비스 등록
/etc/systemd/system/promtail.service
[Unit]
Description=Promtail
After=network.target
[Service]
User=promtail
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/config.yaml
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable promtail
sudo systemctl start promtail
📁 Loki 설정 및 실행
1. Loki 설치
wget https://github.com/grafana/loki/releases/download/v2.9.4/loki-linux-amd64.zip
unzip loki-linux-amd64.zip
chmod +x loki-linux-amd64
mv loki-linux-amd64 /usr/local/bin/loki
2. loki-config.yaml 예시
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
3. loki 실행
/usr/local/bin/loki -config.file=/etc/loki/loki-config.yaml
📊 Grafana에서 로그 확인
- http://localhost:3000 접속
- 기본 계정 admin / admin
- 데이터 소스에 Loki 추가 (http://localhost:3100)
- Explore 탭에서 쿼리:
{job="example", lvl="ERROR"}
🔍 로그가 안나온다면?
- Live 모드를 끄고 Run query로 수동 실행
- 시간 범위(Timerange) 제대로 설정했는지 확인
- promtail에서 로그가 잘 파싱됐는지 확인 (json 파싱 실패 여부 등)
✅ 마무리하며
- Promtail 권한 설정이 핵심 포인트였습니다 (adm 그룹)
- 로그가 Loki에 쌓이는지 curl로 직접 확인도 가능:
curl -G http://localhost:3100/loki/api/v1/labels
- Grafana UI는 익숙해지면 직관적이지만, 처음엔 당황할 수 있음
🚀 다음 목표는?
- Docker로 전체 로그 스택 컨테이너화
- GCP Cloud Run + Firebase Hosting 배포 연동
💡 운영 중인 시스템의 로그를 Loki로 직접 수집해서 확인해본 건 매우 유익한 경험이었고, ELK(Elasticsearch, Logstash, Kibana)보다 훨씬 가볍고 빠르게 구축할 수 있어 개인/스타트업에서 도입하기 좋은 로그 솔루션이라 느꼈습니다.
'개발' 카테고리의 다른 글
| Spring Boot 애플리케이션을 Cloud Run에 Docker로 배포하기 (GCP 배포 실습) (2) | 2025.07.11 |
|---|---|
| Firebase Hosting vs Nginx? (0) | 2025.07.11 |
| iOS 앱 개발 및 배포를 위한 apple developer 셋팅 (0) | 2025.03.18 |
| Flutter로 Google Login 구현해보기(개발 테스트편) part2_with GetX. (0) | 2025.02.14 |
| Flutter로 Google Login 구현해보기(개발 테스트편) part1. (0) | 2025.02.12 |