🔥스파르타 TIL (MSA)

Grafana에서 Loki로 로그를 모니터링 해보자 (feat. 로그 수집 전략)

승승장규 2025. 4. 19. 13:29

Loki는 Grafana Labs에서 개발한 로그 집계 시스템이다. 주로 로그 데이터를 저장하고, 라벨 기반의 메타데이터를 사용하여 로그를 효율적으로 검색할 수 있다는 장점이 있다.

Loki를 사용해보기에 앞서서 MSA 환경에서 로그 관리가 왜 중요한지에 대해 먼저 알아보자

 

우리가 관리하는 서비스들은 점점 늘어나면서 각각의 서비스는 독립적으로 배포되고, 서로 다른 서버 또는 컨테이너에서 실행되게된다.
이런 경우에 하나의 요청이 여러 서비스를 거칠 때 로그를 종합적으로 추적하기가 어렵고, 어디에서 문제가 발생했는지 알기가 점점 더 까다로워지기 때문에 시스템 상태를 모니터링하고, 잠재적인 문제를 사전에 발견하는데 필요하다.

 

로그를 수집하는 전략 중에 Sidecar 패턴, 에이전트 방식, Push 방식에 대해서 간단하게 알아보자

  • Sidecar 패턴 : 메인 서비스와 같은 환경에서 함께 실행되는 보조 컨테이너를 활용하는 방법. 로깅, 모니터링, 프록시 역할 등
    핵심 비즈니스 로직과 직접적인 관련은 없지만, 서비스 운영에 필요한 기능을 담당한다. ex) 쿠버네티스 환경에서는 하나의 포드 안에 메인 서비스와 Sidecar 컨테이너가 함께 배포된다.
    • 장점 : 서비스 단위로 로그 수집이 분리되므로 유연한 관리가 가능
    • 단점 : 서비스마다 Sidecar 컨테이너를 추가 배포해야 하므로 리소스 사용량이 증가하고, 이에 따라 운영의 복잡성도 높아질 수 있다
     

  • 에이전트 방식 : 서버나 노드에 설치된 에이전트가 로그 파일을 통합 수집하는 구조. ex) Filebeat는 로그 파일을 지속적으로 모니터링 하며 로그 이벤트를 수집한 뒤, Logstash를 통해 가공하고, Elasticsearch에 저장되며, 최종적으로 Kibana를 이용해 시각화 및 분석이 가능하다.
    • 장점 : 단일 서버 기반 로그 수집 환경에서 쉽고 효율적인 로그 관리가 가능
    • 단점 : Kubernetes 환경에서는 Pod 단위로 로그를 관리하는 데 제약이 생길 수 있다.
     

  • Push 방식 : 애플리케이션이 직접 로그를 외부 수집 시스템으로 전송하는 구조로 즉, 로그 수집기나 에이전트 없이, 애플리케이션이 발생한 로그를 Kafka나 HTTP API 등을 통해 직접 푸시한다.
    • 장점 : 실시간 로그 전송이 가능하며, 구조가 단순해 커스터마이징이 유리
    • 단점 : 네트워크 장애 시 로그 유실 가능성이 있으며, 로그 수집을 애플리케이션이 책임지므로 시스템 부하와 개발 복잡도가 증가할 수 있다.
     

간단하게 로그의 중요성과 수집 전략에 대해 알아보았습니다. 이제 Grafana에서 Loki를 적용시켜 실제로 로그를 확인해보겠습니다.

 

이번에는 loki-logback-appender를 사용하여 Promtail 설정 없이 Java 애플리케이션에서 로그를 Loki로 전송하기 위한 라이브러리를 사용하기 위한 의존성과 docker-compose.yml을 추가해줍니다.

implementation 'com.github.loki4j:loki-logback-appender:1.5.1'
services:  
  loki:
    image: grafana/loki:3.0.0
    container_name: loki
    ports:
      - "3100:3100"
    volumes:
      - ../loki-config.yml:/mnt/config/loki-config.yml
    command: -config.file=/mnt/config/loki-config.yml
    restart: always

 

그리고 logback.xml 파일을 작성해야한다. docker에 띄울것이기 때문에 host.docker.internal로 작성했다.

<configuration>
    <appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
        <http>
            <url>http://host.docker.internal:3100/loki/api/v1/push</url>
        </http>
        <format>
            <label>
                <pattern>app={애플리케이션 이름},host=${HOSTNAME}</pattern>
            </label>
            <message class="com.github.loki4j.logback.JsonLayout"/>
        </format>
    </appender>

    <encoder>
        <pattern>
            %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%X{traceId}] %msg%n
        </pattern>
    </encoder>

    <root level="DEBUG">
        <appender-ref ref="LOKI"/>
    </root>
</configuration>

 

 

Grafana를 사용해보자

Prometheus를 사용해보자Prometheus란 시간에 따라 수집된 시계열 데이터를 기반으로 하는 모니터링 및 경고 시스템으로, 서버, 컨테이너, 애플리케이션, 마이크로서비스 등에서 메트릭을 수집하고,

seungg8361.tistory.com

이전과 동일하게 Data sources에 Loki를 추가해주자

이제 Explore에 가서 Loki로 변경해준뒤

LogQL을 사용해도 좋고, 간편하게 Label filters와 Line contains로 작성해도 좋다.

여기서 LogQL을 간단하게 설명을 하자면 

{app="gateway-service"} : spring.application.name=gateway-service 로 설정한 모듈의 이름

|= "INFO" : "INFO" 레벨의 로그들만 보기

|= "JwtAuthenticationFilter" : 해당 class에서 발생한 로그만 보기 (현재는 JwtAuthenticationFilter 라는 클래스에서 발생한 로그만 확인하기 위해)

 

'🔥스파르타 TIL (MSA)' 카테고리의 다른 글

Grafana Alert rules 정하기  (0) 2025.04.21
Grafana로 알람 보내기  (0) 2025.04.20
Grafana를 사용해보자  (1) 2025.04.18
Prometheus를 사용해보자  (0) 2025.04.17
Spring Cloud 란? (5) - Event-Driven Architecture  (0) 2025.03.10