Loki를 활용한 로그 수집 환경

최인준·2025년 2월 7일
0
post-thumbnail

배경

이전에는 로그를 보기 위해서는 서버에 직접 접속하여 로그가 저장된 경로를 찾아가 일별로 저장돼있는 로그 파일들을 직접 조회했다.

많이 귀찮다 할 정도는 아니지만 로그를 볼 때마다 이러고 있으면 불편함을 느낀다.

그리고 터미널로 보고 있다보면 눈 꽤나 아프다.

그래서 로그 수집 환경을 구성하기로 했고 두 가지 기술스택을 고려했다. ELK와 Loki이다.

ELK

  • 상대적으로 복잡한 쿼리 활용 가능
  • 시각화에서 큰 장점
  • 대규모 로그 분석에 최적화
  • 운영 부담이 큼
  • 구조가 복잡해서 러닝커브가 높음

Loki

  • 간단한 설정으로 로그 수집 가능
  • Prometheus 환경과 통합 용이
  • 데이터 분석 기능이 ELK보다 떨어짐
  • 로그 필터링은 가능하나 로그 변환은 어려움

이런 차이가 있고 나는 Loki를 선택했다. 이유는 다음과 같다.

  • 기존에 모니터링 환경을 Prometheus + Grafana를 사용하고 있었기에 적용시키기 적절하다.
  • ELK는 파악하고 적용시키는데 너무 많은 시간이 걸린다.
  • 간단한 설정으로 Loki를 먼저 적용시킨 뒤 필요성을 느끼면 ELK 적용으로 변경시키기로 했다.

그래서 Promtail을 활용해 Loki를 적용시켰다.

Loki 적용

yaml 파일 하나로 설정을 끝낼 수 있어 편리하다. 다음과 같이 설정했고 본인의 상황에 맞게 설정 파일을 바꾸면 된다. 모든 변수에 대한 설명은 Loki Configuration 에 있다.

server:  
  http_listen_port: 3100  # Loki API 포트
  grpc_listen_port: 0  # gRPC 포트 (필요 없으면 0으로 설정)

ingester:
  lifecycler:
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
  chunk_idle_period: 5m
  chunk_retain_period: 30s
  max_transfer_retries: 0

schema_config:
  configs:
    - from: 2025-01-01
      store: boltdb-shipper
      object_store: filesystem
      schema: v12
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /var/lib/loki/index
    cache_location: /var/lib/loki/index_cache
    shared_store: filesystem
  filesystem:
    directory: /var/lib/loki/chunks

limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h

chunk_store_config:
  max_look_back_period: 0s

table_manager:
  retention_deletes_enabled: false
  retention_period: 0s

compactor:
  working_directory: /var/lib/loki/compactor
  compaction_interval: 5m
  retention_enabled: true

ruler:
  storage:
    type: local
    local:
      directory: /var/lib/loki/rules
  rule_path: /var/lib/loki/rules-temp
  alertmanager_url: ""
  ring:
    kvstore:
      store: inmemory
  enable_api: true

이걸 그대로 사용해도 문제 없을 것이다.

실행시키기 편하게 loki service를 등록시켜놓자.

[Unit]
Description=Loki Log Aggregation System
After=network.target

[Service]
User=root
Group=root
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/loki-config.yml
Restart=always
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

이후에 systemctl loki start , systemctl loki status 로 실행 시킨 뒤 상태 체크를 해본다.

위와 같이 active가 뜨고 밑에는 Loki 로그가 쭉 보여야 실행 완료다!

이제 Loki를 실행시켰으니 Loki로 로그를 전송시킬 수 있게 Promtail을 설정해야 한다.

Promtail

Promtail은 간단히 말해서 로그 수집기다. 로그를 수집하고 Loki에 전송하는 역할을 한다.

단점이라고 한다면 Loki 전용이라는 것이지만 yml 파일 하나로 설정이 끝나서 설정이 편리하다는 큰 장점이 있다.

아래와 같이 설정한다.

/etc/promtail/promtail-config.yaml

server:
  http_listen_port: 9080  # Promtail HTTP 포트
  grpc_listen_port: 0     # gRPC 비활성화

positions:
  filename: /var/lib/promtail/positions.yaml  # 로그 읽은 위치 저장 파일

clients:
  - url: http://[Loki 서버 IP]:3100/loki/api/v1/push  # Loki 서버 주소 (Loki가 같은 서버라면 localhost)

scrape_configs:
  - job_name: "pokit-info"
    static_configs:
      - targets:
          - localhost
        labels:
          job: "pokit-info-logs"
          __path__: "/var/log/pokit/info/*.log"  # info 폴더 안의 모든 .log 파일

  - job_name: "pokit-error"
    static_configs:
      - targets:
          - localhost
        labels:
          job: "pokit-error-logs"
          __path__: "/var/log/pokit/error/*.log"  # error 폴더 안의 모든 .log 파일

Promtail은 9080포트를 사용한다.

positions는 promtail이 로그를 어디까지 읽었는 지, 그 위치를 저장하기 위해 필요하다.

clients는 로그를 보낼 주소를 넣는다. Loki가 Promtail이 돌아가는 서버와 같은 서버라면 로컬호스트지만 나의 경우엔 모니터링 서버가 따로 있어 해당 IP주소를 기입해주었다. Loki 주소 포트는 3100을 사용한다.

이제 scrape_config에서 job을 구성한다.

자유롭게 설정하면 되고 나는 info 로그와 warn/error 로그, 이렇게 두개의 label을 정했다.

후에 Loki 대시보드를 구성할 때 위와 같이 설정한다면 job_name을 통해 대시보드를 구성할 수 있다.

label을 구성할 때 path에는 보낼 로그가 저장돼있는 경로를 넣는다. 이러면 설정이 끝이다!

간단하게 실행시킬 수 있도록 promtail 서비스도 등록해놓자.

[Unit]
Description=Promtail Service
After=network.target

[Service]
User=root
Group=root
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/promtail-config.yml
Restart=always
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

systemctl start promtail 를 실행하고 systemctl status promtail 로 상태 체크를 해보면

위와 같이 뜨고 promtail 로그가 밑에 쭉 떠야한다!

만약 Loki가 실행되고 있지 않거나 전송에 실패한다면 warn이나 error로그로 전송에 실패했거나 connection refused 로그가 뜰 것이다.

Grafana 대시보드 구성

그라파나에서 Data Source를 추가해야한다. Loki를 선택하고 Loki 실행 주소를 기입한다.

나같은 경우는 모니터링 서버에서 Loki를 실행시켰으므로 localhost와 3100 포트를 넣는다.

그럼 이렇게 추가됨!

옆에 Explore를 누르고 대시보드를 구성할 수 있다.

Label filter를 고를 수도 있고 파일을 직접 고를 수도 있다. 대시보드를 구성하게 되면 최종적으로

이런 결과를 얻을 수 있다. 이제 편하게 Grafana에 들어와서 로그를 볼 수 있다!

결론

비교적 간단한 작업을 통해 로그 수집 환경을 구성할 수 있었다.

적용 이후에 로그를 조회하는데 있어서 매우 편리함을 느끼고 있지만 언젠가 불편함을 느낄 수도 있을 것 같다.

로그 분석이 필요해지거나 시각화가 필요해지면 Loki로는 한계가 있을 것이다.

현재 ELK를 공부중이기 때문에 필요성을 느낀다면 바로 바꿀 수 있도록 할 예정이다.

화이팅!

0개의 댓글

관련 채용 정보