본문 바로가기
개발

EC2에 Promtail + Loki + Grafana로 로그 수집 파이프라인 구축기

by 새싹 아빠 2025. 7. 10.

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에서 로그 확인

  1. http://localhost:3000 접속
  2. 기본 계정 admin / admin
  3. 데이터 소스에 Loki 추가 (http://localhost:3100)
  4. 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)보다 훨씬 가볍고 빠르게 구축할 수 있어 개인/스타트업에서 도입하기 좋은 로그 솔루션이라 느꼈습니다.