본문 바로가기
DevOps/Monitoring, Observability

#2 Loki와 Promtail을 이용해 Grafana에서 로그 데이터 시각화하기

by 방배킹 2025. 10. 13.

저번 글(https://bangbaeking.tistory.com/166)에서는 Prometheus와 Grafana를 활용해 메트릭 데이터 모니터링 환경을 구축하는 방법에 대해 알아보았다.

이번 글에서는 Loki와 Promtail을 이용해 로그(Log) 데이터 모니터링 환경을 구축해보려고 한다.

로그(Log)란?

로그는 시스템이나 애플리케이션이 동작하면서 발생하는 이벤트 기록이다. 예를 들어 서버 시작·종료, 오류 메시지, 사용자 요청, 디버깅 정보 등이 모두 로그에 해당한다.

이러한 로그는 장애 원인 분석, 성능 진단, 보안 감사 등 다양한 목적에 활용되며, 운영 환경에서 빠르고 체계적으로 수집·분석할 수 있는 시스템이 필수적이다.

Loki란?

Loki는 Grafana Labs에서 개발한 로그 수집,저장,조회 시스템으로, Prometheus가 메트릭 데이터를 관리하는 방식에서 영감을 받아 설계되었다.

즉, Prometheus가 “수치 데이터”를 다룬다면, Loki는 “텍스트 로그 데이터”를 다루는 시스템이다.

Loki의 가장 큰 특징은 로그 전체를 인덱싱하지 않고, 라벨(label) 정보만 색인하여 저비용, 고효율 구조를 구현했다는 점이다. 이 덕분에 Elasticsearch 같은 기존 로그 시스템보다 훨씬 가볍고 운영 비용이 적다.

Loki의 구조

Loki는 다음과 같은 구성 요소로 이루어져 있다.

  • Distributor : Promtail 등에서 들어오는 로그를 받아 처리
  • Ingester : 로그를 일시 저장하고, Chunk 단위로 압축·저장
  • Querier : 사용자가 Grafana나 API로 로그를 조회할 때 처리
  • Index Store / Object Store : 로그 메타데이터 및 실제 로그 파일을 저장

이 구조 덕분에 Loki는 대규모 로그를 효율적으로 저장하고 빠르게 검색할 수 있다.

Promtail이란?

Promtail은 Loki로 로그를 전송하는 에이전트(Agent) 로, 서버 또는 컨테이너 환경에서 로그 파일을 실시간으로 감시하고 수집한다.

Promtail의 주요 역할은 다음과 같다.

  • 서버나 컨테이너의 로그 파일을 수집
  • 로그 라인에 라벨(label)을 붙여 구분
  • Loki 서버로 HTTP 전송 (Push)

실습

Loki와 Promtail 컨테이너를 생성하여 로그 모니터링 환경을 직접 구축해보자. (Grafana는 이전 글에서 이미 설정했으므로 이번에는 생략한다.)

docker-compose.yml

loki:
  image: grafana/loki:2.9.8
  container_name: loki
  command: [ "-config.file=/etc/loki/config.yml" ]
  volumes:
    - ./loki/loki-config.yml:/etc/loki/config.yml:ro
    - loki-data:/loki
  ports: [ "3100:3100" ]
  networks: [ obs-net ]
  
promtail:
  image: grafana/promtail:2.9.8
  container_name: promtail
  command: [ "-config.file=/etc/promtail/config.yml" ]
  volumes:
    - ./promtail/promtail-config.yml:/etc/promtail/config.yml:ro
		- 로그 파일 경로:/logs:ro
	networks: [ obs-net ]
  depends_on: [ loki ]
  • Loki : 로그를 수신하고 저장하는 서버
  • Promtail : 지정한 로그 파일을 수집하여 Loki로 전송하는 에이전트

volumes에서 서버의 로그 파일 경로를 Promtail 컨테이너와 연결해 주어야 한다.

그러면 Promtail이 실제 서버의 로그 파일을 읽어 Loki로 전송할 수 있다.

application.yml

로그를 파일로 저장하도록 설정한다.

logging:
  file:
    name: ./logs/${spring.application.name}/app.log

이 설정을 통해 애플리케이션 로그가 “./logs/<서비스명>/app.log” 경로에 저장된다.

promtail-config.yml

Promtail의 설정 파일은 어떤 로그를 읽을지, 어떤 라벨을 붙일지 등을 정의한다.

scrape_configs:
  - job_name: test-service-file
    static_configs:
      - targets: [localhost]
        labels:
          job: spring
          env: dev
          __path__: /logs/*/*.log
  • labels: 로그를 구분하기 위한 라벨 (예: 서비스명, 환경 등)
  • path: Promtail이 실제로 읽을 로그 파일 경로

LogQL이란?

LogQL(Log Query Language)은 Loki의 로그를 조회하고 분석하기 위한 쿼리 언어다.

Prometheus의 PromQL 문법을 기반으로 만들어졌으며, 로그 데이터를 필터링, 검색, 집계할 수 있다.

LogQL의 기본 구조

LogQL 쿼리는 두 단계로 구성된다.

[로그 스트림 선택] [파이프라인 필터링]

 

예를 들어 아래와 같은 LogQL 쿼리가 있다고 하자.

{job="spring", env="dev"} |= "error"
  • {job="spring", env="dev"}
    • 라벨(label)을 이용해 어떤 로그 스트림을 조회할지 선택한다.
  • |= "error"
    • 선택된 로그 중 "error" 문자열이 포함된 로그 라인만 필터링한다.

즉, 위 쿼리는 “개발 환경(dev)에서 실행 중인 spring 서비스의 로그 중, ‘error’가 포함된 로그”를 조회하는 쿼리이다.

Grafana에서 {job="spring", env="dev"} 라벨이 설정된 로그를 직접 조회해보자.

Grafana에서 해당 쿼리를 조회한 화면이다.

조건에 맞는 로그가 시간대별 그래프(Log Volume) 로 표시되고, 하단에는 실제 로그 내용이 리스트 형태로 출력된다.
이를 통해 특정 서비스의 로그를 손쉽게 필터링하고, 로그 발생 추이를 시각적으로 파악할 수 있다.

댓글