본문 바로가기
프로젝트/FitTrip

[트러블슈팅] 각 서비스의 로그 확인을 위한 로깅 시스템 구축

by 진꿈청 2024. 6. 26.

📄 Describe

 

상황

프론트와 백엔드 연동간 다양한 오류가 발생하였습니다.
발생한 오류가 프론트단의 문제인지 백엔드단의 문제를 확인하는 것은 서로의 로그를 비교해보아야 확실히 알 수 있었습니다.

 

하지만 당시 서버에 접근하여 컨테이너 로그를 확인하는 것이 가능한 사람은 배포를 맡은 저만 가능했기에
제가 컴퓨터 앞에 있지 않는 상황에서는 프론트분들이 로그 확인이 불가능했습니다.

 

따라서, 실시간으로 백엔드 서비스의 로그를 확인할 수 있는 방법이 필요했습니다.

 

작업 내용

위 문제의 해결방안으로 로그 실시간 모니터링을 위한 로깅 시스템을 구축하기로 하였고
해당 시스템 구축을 위해 Grafana, Loki, Promtail를 사용하였습니다.

 

Grafana는 수집한 metrics 시각화하기 위한 도구로 로그도 시각화 할 수 있습니다.
LokiGrafana에서 만든 로깅에 특화된 것으로 ELK 방식보다 훨씬 간단하다고 합니다.
Promtail은 모니터링이 필요한 로컬 머신에서 Loki instance에 로컬 로그를 푸시하는 agent라고 합니다.

 

따라서, 플로우는 Promtail -> Loki -> Grafana -> 프론트엔드/백엔드가 됩니다.

 

직접 설치하는 것보다는 도커 네트워크를 이용하는 것이 조금 더 간편할 것이라는 생각이 들어 도커 컴포즈로 구성했습니다.

 

 

docker-compose-monitoring.yml

version: '3'
services:
  # Grafana
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    depends_on:
      - loki
    volumes:
      - grafana-data:/var/lib/grafana
    environment:
      GF_SECURITY_ADMIN_PASSWORD: "fittrip!!"

  # Loki
  loki:
    image: grafana/loki:latest
    container_name: loki
    ports:
      - "3100:3100"
    volumes:
      - loki-data:/loki

  # Promtail
  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    volumes:
      - /home/hdbstn3055/script/logs:/var/log
      - ./promtail-config.yaml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml
    depends_on:
      - loki

volumes:
  grafana-data:
  loki-data:

 

promtatil은 /home/hdbstn3055/script/logs 경로와 볼륨 마운트를 설정하여
각 서비스의 로그가 해당 프롬테일 컨테이너 볼륨에 저장되도록 하였습니다.

 

 

이에 따라 각 서비스들에도 로그를 저장하기 위해 도커 볼륨 마운트 설정을 해주었습니다.

 

docker-compose.yml(커뮤니티 설정 예)

community-service:
    image: hanyoonsoo/community-service:1.0
    container_name: community-service
    environment:
      jasypt.encryptor.password: ${JASYPT_PASSWORD}
    depends_on:
      - zookeeper
      - kafka
      - redis-community
      - mariadb-community
      - discovery-service
      - gateway-service
    volumes:       # 추가
      - ./logs/community-service:/logs # 추가

 

물론, 각 서비스에 logback 설정 파일을 적절하게 만들어주어야 합니다.
(팀원분들께 로그 관련 내용 추가를 부탁드렸던 내용입니다.)

 

 

그리고 PromtailLoki로 로그를 잘 전달하기 위해 promtail-config.yaml도 설정해주어야 합니다.

 

promtail-config.yaml(커뮤니티 설정 예)

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: community-logs
    static_configs:
      - targets:
          - localhost
        labels:
          job: community-logs
          __path__: /var/log/community-service/community.log
    pipeline_stages:
      - multiline:
          firstline: '^\d{2}:\d{2}:\d{2}\.\d{3} \[.*\] INFO  .* \[Web Request (START|END)\]'
          max_wait_time: 1s
          max_lines: 500
  - job_name: communtiy-err-logs
    static_configs:
      - targets:
          - localhost
        labels:
          job: community-err-logs
          __path__: /var/log/community-service/community_err.log
    pipeline_stages:
      - multiline:
          firstline: '^\d{2}:\d{2}:\d{2}\.\d{3} \[.*\] ERROR'
          max_wait_time: 1s
          max_lines: 500

 

이렇게 설정을 해준 뒤 docker-compose-monitoring.yml를 실행시킨 뒤 적절하게 dashboard를 설정해줍니다.

 

그라파나 접속 화면

image

위의 내용을 토대로 프론트엔드와 백엔드를 위한 로깅 시스템 구축을 완료했습니다.

 

🙋🏻 More

 

그라파나와 로키를 사용하긴 했지만,
좀 더 자세히 알아보기 위해 블로그 포스팅과 함께 더 알아보려 합니다.