본문 바로가기
Data/Grafana

LOKI + Grafana를 사용한 분산 환경의 로그 수집

by heekng 2024. 3. 3.
반응형

서버 개발을 진행하고 운영하면서 누구나 맞이하는 상황 중 하나는 로그 수집입니다.
최근 대부분의 서비스는 최소 2대 이상의 서버를 운용해 고가용성을 보장하고, 자원 사용량에 따라 오토스케일링 등의 스케일 아웃을 구성합니다.
이전에 ELK 스택을 사용해 Springboot 로그 수집하기 와 같이 ELK 스택을 사용해서 분산환경의 로그를 수집했지만, 관리포인트 증가로 인해 불편함이 있었고, 매트릭 수집을 위한 Prometheus + Grafana 도 함께 사용하기 위해 프로메테우스 제단의 로그 수집 툴 Loki를 적용했으며 이 과정을 공유합니다.

Loki 설치

로그 수집 시스템을 구축하면서 가장 중요하게 생각한것은 스토리지에 대한 문제입니다.
로그 특성상 항상 새로운 데이터가 스토리지에 저장되고, 시간이 지남에 따라 계속해서 증가한다는 특성을 가지고 있기 때문에 용량관리는 필수적입니다.
Loki는 이러한 데이터 스토리지를 로컬 스토리지가 아닌 S3로 설정할 수 있게 지원합니다.

먼저 환경에 맞는 loki를 설치합니다.

https://github.com/grafana/loki/releases

 

Releases · grafana/loki

Like Prometheus, but for logs. Contribute to grafana/loki development by creating an account on GitHub.

github.com

 

Loki 실행에 사용할 설정 파일을 작성합니다

 

loki-s3-config.yaml

auth_enabled: false  # 인증 비활성화: Loki 서버에 대한 사용자 인증 비활성화

server:
  http_listen_port: 3100  # HTTP 서버가 수신하는 포트 번호

common:
  path_prefix: /tmp/loki  # Loki에서 사용하는 일반적인 경로 접두사
  replication_factor: 1  # 복제 요소 수: Loki 인스턴스 간 데이터 복제 수
  ring:
    instance_addr: 127.0.0.1  # Loki 인스턴스 주소
    kvstore:
      store: inmemory  # 키-값 저장소: 메모리 기반

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true  # 결과 캐시 활성화 여부
        max_size_mb: 100  # 결과 캐시 최대 크기 (MB 단위)
  split_queries_by_interval: 0  # 쿼리 구간별 분할: 쿼리 결과를 어떤 간격으로 분할할 지 여부

query_scheduler:
  max_outstanding_requests_per_tenant: 2048  # 테넌트 당 최대 대기 중인 요청 수

schema_config:
  configs:
    - from: 2024-01-27  # 스키마 설정 시작일
      store: boltdb-shipper  # 데이터 저장소: 볼트DB-Shipper
      object_store: s3  # 객체 저장소: Amazon S3
      schema: v12  # 스키마 버전
      index:
        prefix: index_  # 인덱스 접두사
        period: 24h  # 인덱스 주기

limits_config:
  retention_period: 744h  # 보존 기간: 데이터 보존 기간

storage_config:
  boltdb_shipper:
    active_index_directory: /tmp/loki/index  # 활성 인덱스 디렉터리 경로
    cache_location: /tmp/loki/index_cache  # 캐시 위치
    shared_store: s3  # 공유 저장소: Amazon S3
  aws:
    s3: s3://[accesskey]:[private key]@ap-northeast-2/[bucket name]  # S3 저장소 구성
    s3forcepathstyle: true  # S3 경로 스타일 강제 사용 여부

chunk_store_config:
  max_look_back_period: 720h  # 최대 되돌아보기 기간: 청크 저장소에서 최대 조회 가능한 기간

compactor:
  working_directory: /tmp/loki/compactor  # 컴팩터 작업 디렉터리
  shared_store: s3  # 공유 저장소: Amazon S3
  compaction_interval: 10m  # 컴팩션 간격: 컴팩션 실행 간격
  retention_enabled: true  # 보존 활성화 여부
  retention_delete_delay: 2h  # 보존 삭제 지연: 삭제 전 대기 기간

 

loki 실행을 위한 스크립트를 작성합니다.

 

start-loki.sh

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

 

이렇게 작성된 shellscript 실행 후 매트릭 확인을 통해 정상적으로 loki가 실행중인지 확인할 수 있습니다.

curl -XGET http://localhost:3100/metrics

 

Springboot 환경에서 Logback 설정

현재 로그를 수집하고자 하는 서버는 Springboot 백엔드 서버이며, Loki는 Logback appender 의존성을 제공합니다.

공식으로 제공하는 Promtail을 사용하는 방법도 있지만, 단순 서버의 로그만을 수집하기 위함

 

의존성 추가

implementation "com.github.loki4j:loki-logback-appender:1.4.2"

 

Logback appender 추가

<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
  <http>
    <url>http://[IP]:3100/loki/api/v1/push</url>
  </http>
  <format>
    <label>
      <pattern>app=${APP_NAME},profile=${SPRING_PROFILE}</pattern>
    </label>
    <message>
      <pattern>${CONSOLE_LOG_PATTERN}</pattern>
    </message>
    <sortByTime>true</sortByTime>
  </format>
</appender>

...

<root level="INFO">
  <appender-ref ref="LOKI"/>
</root>

 

  • http.url: 로그정보를 전송할 API
  • format.label.pattern: Loki에서 로그를 인덱싱하기 위한 키를 지정합니다. 인덱싱과 관련있기 때문에 너무 많아도, 너무 적어도 문제가 될 수 있습니다.

Grafana

그라파나의 설치 과정은 생략합니다.

 

Datasource 설정

Grafana와 Loki 간 연결은 간단합니다.

Datasource 선택에서 Loki를 선택한 후, Name과 URL을 지정해주면 설정은 끝납니다.

 

대시보드 구성

대시보드의 경우 사용자에 맞게 커스텀해서 사용하는 것을 추천합니다.

제 경우 아래의 대시보드를 환경에 맞게 커스텀해서 사용중입니다.

https://grafana.com/grafana/dashboards/15141-kubernetes-service-logs/ 

 

Loki Kubernetes Logs | Grafana Labs

Thank you! Your message has been received!

grafana.com

 

마침

이전에 구축했던 ELK스택에 비해 Loki + Grafana는 Loki 초기 설정만 잘 해둔다면 신경쓸 내용이 상대적으로 적었습니다.

또한 Springboot 시스템 매트릭 수집을 Prometheus + Grafana로 사용했던 경험이 있어서 대시보드 구성이 더 쉬웠다는 장점도 있었습니다.

반응형