[카테고리:] Loki

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

    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도 호스트에서 도는 경우

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