Loki, Promtail 이용한 실시간 로그 모니터링 + Docker

구성

Promtail

  • loki프로젝트에서 제공하는 로그 수집기

✅ Promtail 바이너리 다운로드

# 버전 확인 (예: 2.9.4)
VERSION="2.9.4"

# 바이너리 다운로드 및 압축 해제
wget https://github.com/grafana/loki/releases/download/v${VERSION}/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip
chmod +x promtail-linux-amd64
sudo mv promtail-linux-amd64 /usr/local/bin/promtail

✅ Config 파일 작성

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /var/log/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push  # Loki 주소로 입력해야 함.

scrape_configs:
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs # QL 에서 잡을 job 이름.
          __path__: /var/log/*.log # 수집할 로그 파일

✅ Systemd 서비스 등록

## /etc/systemd/system directory

[Unit]
Description=Promtail Log Collector
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/config.yaml
Restart=always

[Install]
WantedBy=multi-user.target

---
systemctl daemon-reload 

🐳 Docker로 Promtail Container

✅ Promtail config 파일 작성

# config-promtail.yaml

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push  # Loki의 주소에 맞게 수정

scrape_configs:
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          __path__: /var/log/*.log

🐳 Docker로 Run

docker run -dit \
  --name promtail \
  -v /var/log:/var/log \ # volume mount
  -v /$(pwd)/config-promtail.yaml:/etc/promtail/config.yaml \
  grafana/promtail:latest \
  -config.file=/etc/promtail/config.yaml

🐙 Docker-Compose Version

version : '3'

services:
  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log
      - ./config-promtail.yaml:/etc/promtail/config.yaml
     command: -config.file=/etc/promtail/config.yaml

---
docker-compose up -d promtail

네트워크 구성

🔥 Promtail과 loki 사이 통신 방식은 push. Promtail 에서 loki 쪽으로 데이터를 push 해줌


Loki

내가 사용하는 방식의 Loki는 Grafana, Prometheus 등 과 같이 올렸어야 했기 때문에 Docker Container 형식으로 올렸다. 따라서, Docker Container 으로 정리했다.

🐙 Docker-Compose Version

  • loki-config.yaml
auth_enabled: false

server:
  http_listen_port: 3100
  log_level: info

ingester:
  lifecycler:
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
  chunk_idle_period: 3m
  max_chunk_age: 1h

schema_config:
  configs:
    - from: 2022-01-01
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /tmp/loki/index
    cache_location: /tmp/loki/boltdb-cache
  filesystem:
    directory: /tmp/loki/chunks

limits_config:
  allow_structured_metadata: false  # 이 항목이 없으면 최신 Loki에서 기동 실패

common:
  path_prefix: /tmp/loki  # compactor 등 여러 모듈이 이 경로를 사용

compactor:
  working_directory: /tmp/loki/compactor  # 필수

ruler:
  alertmanager_url: http://alertmanager:9093
  enable_alertmanager_v2: true
  enable_api: true
  rule_path: /tmp/loki/rules-temp
  storage:
    type: local
    local:
      directory: /tmp/loki/rules
loki:
  image: grafana/loki:latest # docker 제공 공식 image
  container_name: loki
  ports:
    - "3100:3100"
  command: -config.file=/etc/loki/config.yaml
  volumes:
    - /home/rocky/grafana/loki/loki-cfg.yaml:/etc/loki/config.yaml
    - /home/rocky/grafana/loki/loki-data/rules:/tmp/loki/rules
    - /home/rocky/grafana/loki/loki-data/rules-temp:/tmp/loki/rules-temp
    - /home/rocky/grafana/loki/loki-data/index:/tmp/loki/index
    - /home/rocky/grafana/loki/loki-data/chunks:/tmp/loki/chunks
    - /home/rocky/grafana/loki/loki-data/boltdb-cache:/tmp/loki/boltdb-cache
    - /home/rocky/grafana/loki/loki-data/compactor:/tmp/loki/compactor
    - /home/rocky/grafana/loki/loki-data/wal:/tmp/loki/wal
  restart: always


  networks: # 네트워크는 기존 docker-compose에서 Grafana와 같은 네트워크로 설정해주면 된다.(난 따로 설정 안함.)
    - grafana_default
- /home/rocky/grafana/loki/loki-cfg.yaml:/etc/loki/config.yaml
    - /home/rocky/grafana/loki/loki-data/rules:/tmp/loki/rules
    - /home/rocky/grafana/loki/loki-data/rules-temp:/tmp/loki/rules-temp
    - /home/rocky/grafana/loki/loki-data/index:/tmp/loki/index
    - /home/rocky/grafana/loki/loki-data/chunks:/tmp/loki/chunks
    - /home/rocky/grafana/loki/loki-data/boltdb-cache:/tmp/loki/boltdb-cache
    - /home/rocky/grafana/loki/loki-data/compactor:/tmp/loki/compactor
    - /home/rocky/grafana/loki/loki-data/wal:/tmp/loki/wal

위의 Volume mount한 디렉토리를 생성하지 않으면 Container가 실행되지 않는다.

mkdir -p /home/rocky/grafana/loki/loki-data
mkdir -p /home/rocky/grafana/loki/loki-data/{rules,rules-temp,index,chunks,boltdb-cache,compactor,wal}

이렇게 먼저 디렉토리 먼저 생성

퍼미션 부여

chown -R 10001:10001 /home/rocky/grafana/loki/loki-data
chmod -R 777 /home/rocky/grafana/loki/loki-data

위에 처럼 설정을 다 완료하고, 컨테이너가 다 문제 없이 돌고 있다면, Grafana 에서 loki Data source를 등록해주면 된다.

Grafana > ⚙️ Settings > Data Sources > loki

URL이 다음 중 하나여야 한다.

  • http://loki:3100 ← Grafana와 Loki가 같은 도커 네트워크일 때 (보통 Compose 환경)
  • http://localhost:3100 ← Grafana가 호스트에 설치되어 있고 Loki도 호스트에서 도는 경우

이렇게 설정해주면 쿼리를 날려 데이터가 잘 나오는지 확인하면 된다.

댓글

댓글 남기기