Pawith

[Server] 나 pawith인데 로그 관리 잘한다

2023년 12월 26일

안녕하세요 Pawith 백엔드 개발자 심규민입니다.

오늘은 Pawith에서 로그를 관리하는 방법에 대해서 설명하려 합니다.

우선 Pawith에서는 Grafana를 통해 서버를 모니터링하고 있기 때문에, Grafana에서 제공하는 Loki를 이용해서 로그를 관리하기로 했습니다.

Loki란?

Loki는 2018년 Grafana Labs에서 공개한 중앙 로깅 시스템입니다.

로그 수집기인 Promtail을 제공하고 fluent등을 통한 연동 가능한 구조를 가지고 있습니다.

Grafana에서는 Loki의 특징을 다음과 같이 정의하고 있습니다.

  • 수평확장

  • 고가용성지원

  • Multi-tenancy

  • 쉽고 효율적 운영

저희 이중 쉽고 효율적 운영 특징이 가장 중요하다 생각해 Loki를 도입하게 됐습니다.

또한 loki에서 기본적으로 제공하는 promtail을 사용했습니다.


로그 수집기인 promtail을 로그 수집 대상 애플리케이션이 실행중인 서버에 위치시켜 줍니다.

또한 promtail 설정에서 모니터링 서버의 loki로 url을 지정해주면 promtail을 수집한 로그를 loki로 전송해줍니다. 마지막으로 Grafana에서 연결해둔 loki로 로그 데이터 조회를 할 수 있습니다.

promtail 설정

promtail 설정으로는 기본 config.yml이 있으며 저희는 모든 애플리케이션을 도커를 이용해서 관리하기때문에 docker compose 설정 파일도 추가로 관리하고 있습니다.

config.yml

server:
  http_listen_address: localhost
  http_listen_port: 9080
  grpc_listen_port: 0

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

clients:
  - url: http://${domain}/loki/api/v1/push // Loki 서버 도메인

scrape_configs:
  - job_name: log // loki에서 로그 구분 이름
    docker_sd_configs:
      - host: unix:///var/run/docker.sock
        refresh_interval: 15s
    static_configs:
      - targets:
          - localhost
        labels:
          job: log
          __path__: /logs/logback/*.log // 로그 경로

promtail 설정 파일에서 중요한 부분은 로그 경로와 Loki의 URL과 전송한 로그 파일들을 구분하기 위한 job_name이 있습니다. 해당 정보들을 통해 데이터를 Loki에서 조회하고 구분할 수 있습니다

docker-compose.yml

promtail:
    image: grafana/promtail:2.9.0
    container_name: docker-promtail
    restart: always
    volumes:
      - /home/ubuntu/promtail.yaml:/etc/promtail/promtail-config.yaml
      - /home/ubuntu/logs:/logs/logback
    command:
      - "-config.file=/etc/promtail/promtail-config.yaml"
      - "-config.expand-env=true"
    networks:
      - network

Loki 설정 방법

docker-compose.yml

loki:
    image: grafana/loki:master
    container_name: docker-loki
    ports:
      - "3100:3100"
    command:
      - "-config.file=/etc/loki/local-config.yaml"
    deploy:
      resources:
          limits:
            memory: 2GB
    depends_on:
      - grafana
    networks:
      - network

로그 포맷

Loki에서는 로그 데이터를 파싱하는 과정에서 json 파싱도 지원하기 때문에 로그를 json으로 남기면 조회시 데이터 필터링이 쉬워집니다.

저희 Pawith에서는 요청을 구분할 수 있는 threadId와 class이름, 호출 메소드 이름을 남기며 추가적으로 요청이 완료되는데 걸리는 시간을 남겨둠으로써 서버의 모든 API의 성능을 효과적으로 모니터링 할 수 있었습니다.

2023-12-23 01:13:07 [ INFO] {"threadId":"21c7abe5","className":"OAuthController","methodName":"reissue","executeTime":50}



주의해야할점

Loki에서 promtail을 이용해서 로그를 조회할때 조회 주기를 잘 설정해주지 않으면 데이터가 발생하는 순간순간 조회를 하기 때문에 Loki 서버의 자원이 금방 고갈될 수 있습니다.

그래서 Grafana 대시보드 구성에서 Query options의 Min Interval 설정을 적절히 해줘야 합니다.


  • 참고

    https://devocean.sk.com/blog/techBoardDetail.do?ID=163964