• 개인 공부 목적으로 작성한 포스팅입니다.
  • 아래 출처를 참고하여 작성하였습니다. :)

상황

  • 도커 컨테이너 안에 file로 로그를 쌓아두다가 서버가 죽어버리니 컨테이너도 죽어버렸습니다.
  • 컨테이너가 죽어버리니 내부 로그를 볼 수 있는 방법이 없었습니다ㅠㅠ
  • 로그를 컨테이너 외부에 쌓아두지 않은 점을 반성하면서 이어서 든 생각은, 서버에 쌓아둬봤자 이전처럼 서버에 문제가 생기면 문제 상황일 때 또 로그를 못 보는 건 매한가지가 아닌가 싶었습니다.
  • 그래서 서버 외부에 로그를 쌓는 법을 리서치하면서 Grafana Loki를 적용한 내용을 정리합니다.
    • 참고) 위 방식을 적용하기 위해 저는 도커 볼륨을 사용했고, 해당 부분은 생략하고 Grafana Loki를 적용한 부분만 포스팅을 남깁니다.

Grafana Loki

  • Grafana에서 제공하는 로그 출력을 위한 데이터 소스입니다.
  • 아래와 같은 flow를 가지고 있고, k8s에 특화되어 있다고 합니다.

loki

Promtail

  • 애플리케이션의 로그를 수집하여 Loki에 보내는 로그 수집기입니다.

Loki

  • 로그 저장 및 구문 분석에 사용되며 다운스트림 프레젠테이션을 위한 쿼리 API를 제공합니다.

Grafana

  • Grafana는 Loki의 로그 시각화를 담당합니다.

설치

  • 다운로드 받을 때는 master 브랜치가 아니라 버전명이 제대로 기입되어야 합니다.
  • 저는 참고한 포스팅을 따라 v2.3.0으로 진행했습니다.

Promtail,Loki 로컬 설치

  • Promtail와 Loki를 로컬로 설치합니다.
wget https://github.com/grafana/loki/releases/download/v2.3.0/loki-linux-amd64.zip
wget https://github.com/grafana/loki/releases/download/v2.3.0/promtail-linux-amd64.zip

Promtail,Loki 설정 파일 설치

  • Promtail와 Loki를 사용하는데 필요한 설정 파일도 로컬로 설치합니다.
wget https://raw.githubusercontent.com/grafana/loki/v2.3.0/clients/cmd/promtail/promtail-local-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/v2.3.0/cmd/loki/loki-local-config.yaml

설정

  • 설치를 했으니 필요한 설정을 해줍니다.

Promtail 설정

  • 초기의 promtail-local-config.yaml 아래와 같습니다.
  • clients에는 실행중인 Loki url을 입력합니다.
  • loki/api/v1/pushpromtail로 수집한 로그를 Loki에 푸쉬하는 POST 요청 api 입니다.
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

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

scrape_configs:
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          __path__: /var/log/*log
  • scrape-configs에 job을 추가할 수 있어서 저는 아래와 같이 수정했습니다.
  • 배포서버 내에 lokiPromtail이 같이 있었으므로 clients 속성은 localhost로 주었습니다.
  • /tmp/log/*log: 제가 SpringBoot에서 로그를 내보내는 경로가 /tmp/log이며 *log를 사용해서 해당 경로 안에 있는 모든 *.log 파일을 읽을 수 있습니다.
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

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

scrape_configs:
  - job_name: server-log
    static_configs:
      - targets:
          - localhost
        labels:
          job: server-log
          __path__: /tmp/log/*log
  • 다른 서버에서 실행중인 Loki로 보내는 방법은 아래와 같습니다.
clients:  # url 을 변경
  - url: http://{요청 보낼 Loki 서버 url}:{요청 보낼 Loki port}/loki/api/v1/push

scrape_configs:
  - job_name: mylog
  static_configs:
  - targets:
    - {요청 보낼 Loki 서버 url}
  labels:
    job: mylog
    __path__: {경로}/mylog.log

Loki 설정

  • loki-local-config.yaml 설정을 건드리면 되는데 따로 건드린 건 없었습니다.
  • 포트 변경을 원한다면 http_listen_port를 원하는 포트로 바꿔주면 됩니다. 디폴트 포트는 3100입니다.
auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096
  
# ...

실행

  • 이제 모든 설정을 마쳤으니 LokiPromtail을 실행하면 됩니다.

Loki 실행

  • 아래 명령어를 사용하면 loki가 실행됩니다.
./loki-linux-amd64 -config.file=loki-local-config.yaml
# 백그라운드로 띄우기
nohup ./loki-linux-amd64 -config.file=loki-local-config.yaml &

Promtail 실행

  • 아래 명령어를 사용하면 promtail가 실행되며 로깅 수집 대상이 되는 파일을 연결해줍니다.
./promtail-linux-amd64 -config.file=promtail-local-config.yaml
# 백그라운드로 띄우기
nohup ./promtail-linux-amd64 -config.file=promtail-local-config.yaml &

grafana 연동

  • 위 과정을 통해 application log => promtail => loki로 이어지는 흐름은 완성했습니다.
  • 이제는 grafana 연동을 통해 loki => grafana 흐름을 완성할 차례입니다.

  • data source로 Loki를 선택합니다.

239ca9b85d0a40be80ec052a5faad509


  • loki가 실행되고 있는 서버 URL을 입력합니다.

61e95d9321a94c2880e57272a33de55f


  • Promtail 설정에 따라 filename 또는 jobs로 쿼리를 생성합니다.

977162385fb74a2aa92af7384a64e7a3


  • 저는 아래와 같이 연동을 완료했습니다.

스크린샷 2022-07-19 오후 3 17 50