본문 바로가기
배포

Loki, Promtail 활용 로그 모니터링 환경 구축

by LDY3838 2024. 12. 4.
반응형

해당 포스트에서는 Loki와 Promtail을 활용하여 서버에서 발생하는 로그들을 모니터링 서버에 보내고, 이를 손쉽게 확인할 수 있도록 만들도록 해보겠습니다.

해당 포스트는 아래의 2개의 포스트에 있는 내용인 Prometheus, Grafana를 활용한 모니터링 환경 구축, Logback을 활용한 서버 로그 관리에 이어서 작업하도록 하겠습니다.

프로젝트명이 변경된 부분을 제외하고는 내용은 동일합니다.

 

Prometheus, Grafana를 이용한 EC2 모니터링 환경 구축

프로젝트를 진행하면서 이후 유저에게 서비스를 제공하는 상황을 대비하여 배포 서버에 대한 모니터링 환경 구축을 해보고자 합니다.데이터 수집 툴 선택우선 EC2를 모니터링하기 위한 방식을

dy-coding.tistory.com

 

 

Logback을 이용한 EC2 환경 로그 관리

이번 게시글에서는 Logback을 활용하여 EC2 환경에서 로그 관리하는 방법에 대해서 다루도록 하겠습니다.프로젝트를 진행하면서 로컬에서 개발할 때는 바로 로그를 확인할 수 있지만 EC2에 프로젝

dy-coding.tistory.com


Promtail을 활용한 로그 정보 전송

우선 Loki를 활용하여 로그 정보를 보여주기 위해서는 실제 어플리케이션이 동작하는 서버에 Promtail을 동작시켜 로그 정보들을 모니터링 서버의 Loki로 보내주어야 합니다.

본 서버에서 Logback으로 수집되고 있는 로그 파일들을 전송하기 위한 Promtail을 실행하기 위해서 docker-compose-monitoring.yml 파일을 생성 및 아래와 같이 작성해 줍니다.

코드의 내용은 ec2의 로그 파일과 promtail 내부의 로그 관련 파일들을 바인딩해 주는 기능을 나타내고 있습니다.

version: '3'

services:
  promtail:
    image: grafana/promtail:latest
    volumes:
      - ./logs/shwimping:/logs
      - ./promtail-config.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

이와 같은 doker-compose 파일을 만든 후 promtail-config.yml 파일을 작성해야 합니다. 해당 파일의 내용은 아래와 같습니다.

positions:
  filename: /root/promtail/positions.yaml # 동기화 작업을 이루기 위해 promtail이 읽은 마지막 로그 정보를 저장하는 곳

clients:
  - url: [모니터링 서버 주소]/loki/api/v1/push # push할 Loki의 주소

scrape_configs:
  - job_name: info-info
    static_configs:
      - targets:
          - localhost
        labels:
          job: info_info_logs
          __path__: /logs/log/common/info/*.log # info 폴더 내에 log 파일들 모두 수집

  - job_name: info-warn
    static_configs:
      - targets:
          - localhost
        labels:
          job: info_warn_logs
          __path__: /logs/log/common/warn/*.log # warn 폴더 내에 log 파일들 모두 수집

  - job_name: info-error
    static_configs:
      - targets:
          - localhost
        labels:
          job: info_error_logs
          __path__: /logs/log/common/error/*.log # error 폴더 내에 log 파일들 모두 수집

  - job_name: error-info
    static_configs:
      - targets:
          - localhost
        labels:
          job: error_info_logs
          __path__: /logs/log/error/info/*.log # info 폴더 내에 log 파일들 모두 수집

  - job_name: error-warn
    static_configs:
      - targets:
          - localhost
        labels:
          job: error_warn_logs
          __path__: /logs/log/error/warn/*.log # warn 폴더 내에 log 파일들 모두 수집

  - job_name: error-error
    static_configs:
      - targets:
          - localhost
        labels:
          job: error_error_logs
          __path__: /logs/log/error/error/*.log # warn 폴더 내에 log 파일들 모두 수집

위 파일을 통해서 모니터링 서버로 로그들을 전송해 주는 기능을 구현 가능합니다.

이와 같이 파일들을 작성 후 아래의 코드를 통해 docker-compose 파일을 실행시켜 주면 실제 배포 서버에서의 작업은 끝이 납니다.

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

Loki를 활용한 로그 정보 수집

이제는 모니터링 서버에서 배포 서버에서 보내는 로그들을 받아서 수집해주어야 합니다. 이를 위해 Loki를 활용합니다.

기존에 작성하였던 docker-compose.monitoring.yml 파일에 아래와 같은 내용을 추가해 줍니다.

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

위 파일을 docker-compose를 실행시킬 때 Loki를 함께 실행시키겠다는 의미입니다. 이때 모니터링 서버가 EC2와 같은 Cloud Computing Service 기반으로 동작하고 있다면 inbound 규칙에 3100번 port를 추가해주어야 합니다.

위 코드를 추가한 docker-compose.monitoring.yml 파일의 전체 내용은 아래와 같습니다.

version: '3'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/prometheus/prometheus.yml:ro
    ports:
      - 19090: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:
      - 13030: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 -f docker-compose.monitoring.yml up -d

Grafana를 활용한 로그 확인

이제 모든 준비가 끝났으니 Grafana에서 로그가 정상적으로 출력되는지 확인해 보도록 하겠습니다.

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

이와 같은 작업 후에는 아래와 같은 로그들을 확인할 수 있습니다.


모든 시스템에서는 모니터링 환경이 중요하다고 생각합니다. 이때 사용자의 활동 기록을 알려주는 로그를 특히 조심해서 취급하고 다루어야 하는데 이를 손쉽게 확인할 수 있는 기능을 구현하여 서비스 장애 시 발 빠른 처리가 가능한 구조를 만든 부분이 만족스러웠습니다.

반응형

댓글