Post

그라파나와 로키로 로그보기

로그 열람하기

서비스를 운영하다 보면 로그를 종종 봐야하는데, 여러 방식에서 불편함을 느끼고 있었다.

예를 들면 여러 요청들의 로그가 뒤섞여서 흐름 파악이 힘들다던지, 필요한 정보가 없거나 필요없는 데이터가 너무 많이 찍힌다던지 등등 개선할 점들이 있었는데, 오늘은 로그를 확인하는 방식에 대해 개선한 경험을 작성하려 한다.

기존 방식

나는 지금 aws ec2에서 서비스를 운영중이다. ip 주소나 자원 할당량이 고정되어 있기 때문에 ssh 연결이 쉬운편이라 매번 로그를 확인하기 위해 직접 서버에 접속해서 로그 파일을 확인했다.

그런데 이 방식에는 몇 가지 문제점이 존재했다.

문제점

외부 확인

aws 보안 정책에서 우리집 아이피가 아니면 ssh 접속이 되지 않도록 설정해 놓았는데, 종종 카페같은 곳에서 로그를 확인하려고 하면 굉장히 번거로웠다.

해당 카페 ip 추가하고 접속해서 로그보고 다시 ip 삭제하는 이 과정이 너무 귀찮았다. 그리고 내 노트북이 없는 상황에서는 ssh 접속할 방법이 전무했다. 만약 에러가 발생하면 슬랙으로 관련 스택트레이스 정보들이 전송되게 설정했지만, 무료 사용자라 글자수 제한 때문에 내용 전부를 확인하기 힘들었다.

잠재적 위험성

서버에 접속해서 수동으로 스크립트를 치는 행위 자체가 어느정도 위험성이 있다고 생각했다. 물론 내가 입력하는 스크립트는 크리티컬한 내용도 없고 매번 주의하면서 작성하지만, 사람이다보니 언제 어떤 실수를 할 지 장담할 수 없다.

항상 정해진 입력만 수행될 수 있도록, 사람의 입력이 제한될수록 좋을 것이라 생각했다.

개선해보자

loki-overview-2

내 서비스는 모니터링 시각화 툴로 그라파나를 사용중인데, 로키라는 로그 관련 시스템을 지원한다고 해서 한번 도입해봤다.

대략 흐름을 간추리면

  • 프롬테일(에이전트, 로그 수집) -> 로키(서버, 로그 저장 및 분석) -> 그라파나(시각화)

이런 느낌인 것 같다.

Promtail

먼저 프롬테일을 로그가 존재하는 어플리케이션 서버에 설치해준다.

1
2
3
4
5
wget https://github.com/grafana/loki/releases/download/v2.9.1/promtail-linux-amd64.zip

unzip promtail-linux-amd64.zip

wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml

그리고 yaml 파일을 자신의 환경에 맞게 편집해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server:
  http_listen_port: http_포트
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://로키가.설치될.서버.주소:포트/loki/api/v1/push

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: dev-log
      __path__: /로그/파일/절대경로/*log
      stream: stdout

이제 프롬테일을 실행해준다.

1
nohup ./promtail-linux-amd64 -config.file=./promtail-local-config.yaml 2>&1 &

Loki

로키를 실행할 차례다. 나는 그라파나가 구동되고 있는 서버에 설치해줬다.

1
2
3
4
5
6
wget https://github.com/grafana/loki/releases/download/v2.9.1/loki-linux-amd64.zip

unzip loki-linux-amd64.zip

wget https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml

로키는 yaml 파일을 설정할 건 크게 없다. 원하는 포트나 값이 따로 있다면 설정해주자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# ...

server:
  http_listen_port: http_포트
  grpc_listen_port: 

common:
  instance_addr: 127.0.0.1
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h
# ...

이제 로키를 실행해주자.

1
nohup ./loki-linux-amd64 -config.file=loki-local-config.yaml 2>&1 &

그라파나에 등록

configuration -> data sources -> Add Data Source에서 Loki를 클릭하자.

스크린샷 2024-06-11 162131

자신에게 맞는 값을 넣어주고 Save & test를 누르면 된다. 만약 데이터가 수집되고 있지 않다면 테스트에 실패하니 프롬테일을 먼저 구동시켜주고 이 과정을 다시 시도해보자.

스크린샷 2024-06-11 162238

로그 확인하기

Explore 탭에 들어가서 리스트박스의 타겟을 로키로 변경해준다.

그리고 labels에서 원하는 로그를 선택 후 Run query를 누르거나 분봉을 변경해주면 로그가 조회된다. 나는 job으로 개발 서버와 운영 서버의 로그를 구분해봤다.

스크린샷 2024-06-11 163221

조회가 잘 되는 것을 확인할 수 있다.

스크린샷 2024-06-11 163255

참고

  • https://grafana.com/docs/loki/latest/get-started/overview/
  • https://inma.tistory.com/164
This post is licensed under CC BY 4.0 by the author.

© . Some rights reserved.

Using the Jekyll theme Chirpy