빙응의 공부 블로그

[+/KM] AWS EC2에서 Loki, Promtail로 실시간 로그 시각화하기 본문

Project/PlusKM

[+/KM] AWS EC2에서 Loki, Promtail로 실시간 로그 시각화하기

빙응이 2025. 6. 17. 00:45

📝배경

저번 포스팅에서 Prometheus와 Grafana를 이용해 시스템 모니터링 시각화를 진행했었죠. 이번 시간에는 여기서 한 발 더 나아가, Grafana에서 애플리케이션 로그 정보까지 효과적으로 시각화하는 방법을 알아보겠습니다.

 

이 포스팅은 아래 두 개의 선행 포스팅을 완료하신 분들을 대상으로 합니다. 만약 아직 진행하지 않으셨다면, 먼저 읽어보시기를 강력히 추천드립니다.

[+/KM]Logback으로 EC2 환경 로그 관리하기

 

[+/KM]Logback으로 EC2 환경 로그 관리하기

📝배경 이번 게시글에서는 Spring Boot에서 Logback을 활용해 EC2 서버에서 로그를 환경별로 효율적으로 관리하는 방법에 대해 설명합니다.특히, 운영 환경에서 로그 가독성 문제를 어떻게 해결했는

quddnd.tistory.com

[+/KM] AWS EC2에서 Prometheus와 Grafana로 실시간 시스템 상태 시각화하기

 

[+/KM] AWS EC2에서 Prometheus와 Grafana로 실시간 시스템 상태 시각화하기

📝배경저번 포스팅에서는 Logback을 이용한 로그 저장을 다뤘습니다. 덕분에 애플리케이션 내부에서 발생하는 이벤트들을 효율적으로 기록할 수 있게 되었죠. 하지만 로그를 열심히 쌓는 와중에

quddnd.tistory.com

 

📝Loki와 Promtail

Loki와 Promtail은 Grafana Labs에서 개발한 로그 관리 시스템의 핵심 구성 요소입니다. 둘은 함께 작동하여 애플리케이션이나 시스템에서 발생하는 로그를 수집하고, 중앙에 저장하며, Grafana와 같은 대시보드에서 시각화하고 탐색할 수 있도록 돕습니다.

 

1. Loki (로그 저장 창고 겸 검색 엔진)

Loki는 Prometheus(메트릭 모니터링 시스템)의 아이디어를 로그에 적용한 시스템입니다. Prometheus가 메트릭 데이터(CPU 사용량, 메모리 사용량 등)를 시계열 데이터베이스에 저장하고 쿼리하듯이, Loki는 로그 데이터를 저장하고 쿼리합니다.

 

2. Promtail (로그 수집 배달원)

Promtail은 Loki의 에이전트입니다. 여러분의 애플리케이션이나 시스템이 실행되는 서버에 설치되어, 그 서버의 로컬 로그 파일을 실시간으로 모니터링하고 Loki로 전송하는 역할을 합니다.

 

Loki와 Promtail: 설치 위치 명확화

방금 설명드린 Loki와 Promtail의 역할을 바탕으로, 이 두 구성 요소를 서버의 어디에 설치해야 하는지 명확히 정리해 보겠습니다.

  • Loki (로그 저장 창고 겸 검색 엔진):
    • 설치 위치: 모니터링 서버
    • 이유: Loki는 Promtail이 보낸 로그 데이터를 최종적으로 저장하고, Grafana 같은 도구에서 로그를 쿼리하고 검색할 수 있도록 하는 중앙 집중식 저장소입니다. 따라서 Prometheus, Grafana와 같이 모니터링을 담당하는 중앙 서버에 설치하는 것이 일반적입니다.
  • Promtail (로그 수집 배달원):
    • 설치 위치: 로그를 수집하고자 하는 애플리케이션 서버 (혹은 로그가 발생하는 모든 서버)
    • 이유: Promtail은 각 서버에 직접 설치되어 해당 서버의 로컬 로그 파일(예: Spring Boot 애플리케이션 로그 파일)을 읽고, 실시간으로 이 로그들을 Loki 서버로 전송하는 에이전트 역할을 합니다. 마치 각 서버에서 로그를 "수거"하여 중앙 창고(Loki)로 "배달"하는 것처럼요.

📝애플리케이션 서버 Promtail 설정하기(Docker 환경)

위에서 설명드린 것처럼, Promtail은 애플리케이션 서버에 직접 설치되어 해당 서버의 로그 파일을 읽고 중앙 Loki 서버로 전송하는 에이전트 역할을 합니다. 따라서 여러분의 애플리케이션이 실행되는 서버, 즉 로그가 생성되는 서버에 Promtail 설정을 완료해야 합니다.

저는 Docker 환경에서 애플리케이션을 배포하고 있으니, Docker Compose를 활용하여 Promtail을 설정하는 방법을 기준으로 설명해 드릴게요. Docker 환경에서는 Promtail 설정을 위해 YAML 파일을 작성하게 됩니다.

1. docker-compose.monitering.yml 파일 작성

먼저, Promtail 컨테이너를 정의할 docker-compose.monitering.yml 파일을 아래와 같이 작성합니다.

version: '3'

services:
  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    volumes:
      # 호스트의 실제 로그 루트 경로를 Promtail 컨테이너의 /logs/logging 경로에 마운트합니다.
      - ./logs/logging:/logs/logging
      - ./promtail-config.yml:/etc/promtail/config.yml # 이 줄은 그대로 둡니다.
    command: -config.file=/etc/promtail/config.yml
    restart: always

 

해당 파일은 EC2의 로그 파일과 Promtail의 파일들을 마운트해주는 설정입니다.

 

2. promtail-config.yml 파일 작성 (가장 중요!)

다음으로, Promtail이 실제 로그를 어떻게 수집하고 Loki 서버로 보낼지를 정의하는 promtail-config.yml 파일을 작성해야 합니다. 이 파일은 docker-compose.monitering.yml 파일과 같은 레벨에 위치해야 합니다.

 

아래의 파일 경로 설정이 이해가 안된다면 해당 포스팅을 봐주시기 바랍니다.

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml
clients:
  - url: http://[Monitering Server IP]:3100/loki/api/v1/push

scrape_configs:
  - job_name: info-info
    static_configs:
      - targets:
          - localhost
        labels:
          job: info_info_logs
          __path__: /logs/logging/log/common/info/*.log

  - job_name: info-warn
    static_configs:
      - targets:
          - localhost
        labels:
          job: info_warn_logs
          __path__: /logs/logging/log/common/warn/*.log

  - job_name: info-error
    static_configs:
      - targets:
          - localhost
        labels:
          job: info_error_logs
          __path__: /logs/logging/log/common/error/*.log

  - job_name: error-info
    static_configs:
      - targets:
          - localhost
        labels:
          job: error_info_logs
          __path__: /logs/logging/log/error/info/*.log

  - job_name: error-warn
    static_configs:
      - targets:
          - localhost
        labels:
          job: error_warn_logs
          __path__: /logs/logging/log/error/warn/*.log

  - job_name: error-error
    static_configs:
      - targets:
          - localhost
        labels:
          job: error_error_logs
          __path__: /logs/logging/log/error/error/*.log

 

3. Docker 컨테이너 재시작 및 인바운드 규칙 수정

위의 설정들을 진행하고 Docker 컨테이너를 재시작하면 애플리케이션 서버에서는 로그를 보낼 준비가 완료됩니다.

또한 EC2에서 Loki가 접근해야하는 3100 포트에 대한 인바운드 규칙을 허용해야 합니다. 

docker-compose -f docker-compose.monitoring.yml up -d

 


📝모니터링 서버 Loki 설정하기 (Docker 환경)

이제 이 로그들을 실제로 받아 저장하고 관리할 중앙 Loki 서버를 설정할 차례입니다.

 

저는 Docker 환경에서 Promtail과 마찬가지로 Loki도 Docker Compose를 활용하여 쉽고 효율적으로 배포할 것입니다.

이 과정은 모니터링 서버에서 진행됩니다.

 

✅docker-compose-monitoring.yml 에 Loki 추가하기

먼저, Loki 컨테이너를 정의를 위해 docker-compose-monitoring.yml 파일을 수정해야합니다.

version: '3'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/prometheus/prometheus.yml:ro
    ports:
      - 9090:9090
    command:
      - "--web.enable-lifecycle"
    restart: always
    networks:
      - promnet
    user: root

  grafana:
    image: grafana/grafana
    container_name: grafana
    volumes:
      - ./grafana-volume:/var/lib/grafana
    restart: always
    networks:
      - promnet
    ports:
      - 3030:3000
    user: root

  loki:
    image: grafana/loki:latest
    container_name: loki
    restart: always
    ports:
      - 3100:3100
    command: -config.file=/etc/loki/local-config.yaml

networks:
  promnet:
    driver: bridge

기존 코드에 Loki 관련 설정만 추가하였습니다.

위 파일은 Docker-compose를 실행할 때 Grafana, Prometheus, Loki를 실행시킨다는 의미입니다. 

 

✅docker 컨테이너 재시작, Grafana Loki 불러오기 

이제 docker 컨테이너를 재시작하고 Grafana에 Loki 템플릿만 불러오면 끝입니다.

Grafana에서 Loki를 추가한 후 13639번 템플릿을 이용하여 새로운 대시보드를 생성해 주면 됩니다.

docker-compose -f docker-compose.monitoring.yml up -d

 

 

이제 아래처럼 로그를 확인할 수 있습니다.

Grafana Loki 로그 사진

 

 


📝결론

이 포스팅에서는 Prometheus와 Grafana를 활용한 기존 시스템 모니터링에서 한 단계 더 나아가, 애플리케이션 로그까지 효과적으로 시각화하는 방법을 다루었습니다. 이를 위해 Grafana Labs에서 개발한 LokiPromtail을 도입했습니다.

 

Loki는 Prometheus의 아이디어를 로그에 적용한 시스템으로, 로그 데이터를 중앙 집중식으로 저장하고 쿼리하는 역할을 합니다. 마치 로그를 위한 거대한 창고이자 검색 엔진과 같습니다. Promtail은 Loki의 에이전트로서, 애플리케이션이 실행되는 각 서버에 설치되어 실시간으로 로컬 로그 파일을 모니터링하고 Loki로 전송하는 배달원 역할을 수행합니다.

 

최종적으로 Docker 컨테이너를 재시작하고 Grafana에서 Loki 데이터 소스를 추가한 후, 제공된 템플릿(13639번)을 활용하여 대시보드를 생성함으로써 애플리케이션 로그를 성공적으로 시각화할 수 있었습니다. 

이처럼 로그 시각화를 통해 운영자는 서비스 상태를 실시간으로 파악하고, 장애 원인을 빠르게 추적할 수 있어 전반적인 운영 안정성을 높일 수 있습니다.