안녕세계

[Spring] 그라파나와 로키로 애플리케이션 로그 조회하기 본문

[Spring] 그라파나와 로키로 애플리케이션 로그 조회하기

Junhong Kim 2023. 4. 22. 17:50
728x90
반응형

그라파나와 로키 그리고 프롬테일

그라파나(Grafana)

그라파나는 오픈소스 데이터 시각화 및 분석 도구입니다. 그라파나는 다양한 데이터소스로부터 데이터를 가져와서 대시보드와 그래프 등으로 데이터를 시각화할 수 있으며 프로메테우스(Prometheus), 로키(Loki), 엘라스틱서치(ElasticSearch, ES) 등과 통합이 잘 되어 있습니다.

로키(Loki)

로키는 프로메테우스와 함께 사용하기 위해 개발된 시스템으로 프로메테우스와 마찬가지로 그라파나 랩스(Grafana Labs)에서 개발하고 있습니다. 프로메테우스는 수집된 메트릭을 저장하고 그래프로 시각화할 수 있도록 지원하는 시스템입니다. 하지만, 로그 데이터를 수집하고 검색하는 기능은 제공하지 않습니다. 이에 반해 로키는 프로메테우스의 기본 데이터 형식인 텍스트 기반 로그 포맷을 사용하여 로그 데이터를 수집하고 저장합니다.

프롬테일(Promatail)

프롬테일은 로그 파일을 실시간으로 감시하고 새로운 로그 메시지가 추가될 때마다 로그를 읽어서 로키로 전송합니다. 프롬테일은 로그 파일을 직접 읽어서 로키에 전송하는 것이 아닌 tailing을 사용하여 실시간으로 로그 데이터를 읽습니다. 이는 로그 파일을 읽는 과정에서 다른 프로세스에 영향을 미치지 않으며 높은 처리량을 제공합니다. 따라서, 대규모 분산 시스템에서 발생하는 로그 데이터를 효율적으로 수집하고 분석할 수 있습니다.

액츄에이터에서 로그 조회하기

로그백(logback) 설정

애플리케이션 로그를 콘솔과 파일 두 위치에 남기기 위해서 logback-spring.xml을 다음과 같이 추가합니다.
(본 포스팅에서는 logback 설정에 대한 설명은 다루지 않습니다. 🫣)

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <property name="LOG_PATH" value="./logs"/>
    <property name="LOG_FILE_NAME" value="my"/>

    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
		<!-- 콘솔에 로그를 남기는 appender -->
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>

		<!-- 파일에 로그를 남기는 appender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}backup/app-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 최상위 로거 설정 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

액츄에이터(actuator)에서 로그 조회

앞서 로그백 설정을 통해 애플리케이션 로그를 파일에 남길 수 있게되었습니다. 이제 파일에 남겨진 로그를 액츄에이터에서 조회하기 위해서 엔드포인트를 노출하고 로그 파일 위치를 설정합니다. (액츄에이터와 관련된 내용은 이전 포스팅을 참고해주세요.)

management:
  server:
    port: 8080
  # 추가(1)
  endpoints:
    web:
      exposure:
        include: ["prometheus", "logfile"]
  # 추가(2)
  endpoint:
    logfile:
      external-file: ./logs/my.log # .(comma) 넣는 것 잊지 마세요!

`http://localhost:8080/actuator/logfile`으로 접속해서 파일에 남겨진 로그가 액츄에이터 엔드포인트를 통해서도 잘 조회되는지 확인해주세요. 여기까지 잘 진행하셨다면 이제 본격적으로 로키와 프롬테일을 활용해서 애플리케이션 로그를 조회하는 방법에 대해 알아보겠습니다.

로키와 프롬테일 설정

로키와 프롬테일의 최신 버전은 여기에서 확인할 수 있습니다. MacOS 사용자인 경우 `darwin-amd64` zip 파일을 다운로드 받아 압축을 해제하시면 됩니다. 또는 curl을 사용하여 다운로드 받을 수 있습니다.

# 실행 파일 다운로드
curl -O -L "https://github.com/grafana/loki/releases/download/v2.8.0/loki-darwin-amd64.zip"
curl -O -L "https://github.com/grafana/loki/releases/download/v2.8.0/promtail-darwin-amd64.zip"

# 설정 파일 다운로드
curl -O -L "https://raw.githubusercontent.com/grafana/loki/v2.8.0/cmd/loki/loki-local-config.yaml"
curl -O -L "https://raw.githubusercontent.com/grafana/loki/v2.8.0/clients/cmd/promtail/promtail-local-config.yaml"

# 다운로드된 파일
-rwxr-xr-x@ 1 jhk  staff    63M Apr  4 06:41 loki-darwin-amd64
-rw-r--r--  1 jhk  staff   1.3K Apr  7 00:00 loki-local-config.yaml
-rwxr-xr-x@ 1 jhk  staff    97M Apr  4 06:42 promtail-darwin-amd64
-rw-r--r--  1 jhk  staff   303B Apr  7 00:00 promtail-local-config.yaml

로키 설정

(선택) 로키의 기본 포트 변경이 필요하다면 로키 설정 파일을 수정하면 됩니다.

$ vim loki-local-config.yaml
auth_enabled: false

server:
  http_listen_port: 3100 # 원하는 포트로 수정 (default: 3100)
  grpc_listen_port: 9096

...

프롬테일 설정

(필수) 프롬테일에서 수집한 로그를 로키로 보내기 위해서는 프롬테일 설정 파일을 수정해야 합니다.

$ vim promtail-local-config.yaml
# 기본
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push # <Loki 주소>:<port>/loki/api/v1/push


scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/*log
# 추가
- job_name: mylog
  static_configs:
  - targets:
    - localhost # <Loki 주소>
    labels:
      job: mylog
      __path__: /Users/jhk/Documents/monitoring-app/logs/my.log # 로컬 환경이므로 fullpath를 작성하는 것을 잊지마세요!
  • `clients`에 로키 주소 `localhost:3100`가 기본적으로 설정되어 있습니다.
  • `localhost:3100/loki/api/v1/push`는 프롬테일로 수집된 로그를 로키로에 전달하는 API 요청입니다.
  • `scrape-configs`에 사용자 정의 job을 추가할 수 있습니다.
    여기에 현재 파일로 남기고 있는 로그를 로키로 전달되도록 mylog job 설정을 추가했습니다.

로키에서 애플리케이션 로그 확인하기

로키와 프롬테일을 다음 명령어로 설정 파일과 함께 실행합니다.

./loki-darwin-amd64 -config.file=loki-local-config.yaml # 3100 port
./promtail-darwin-amd64 -config.file=promtail-local-config.yaml

로키와 프롬테일이 실행되었으니 이제 그라파나에서 로키로 수집된 데이터를 확인해 봅시다.

그라파나를 실행하고 데이터소스로 로키를 추가해주세요.

./bin/grafana-server # 그라파나 실행

로키 데이터소스 추가

로키가 실행되고 있는 주소를 입력하고 저장합니다.

로키 URL 추가

Explore 메뉴에서 데이터소스를 로키로 바꿔줍니다. 이후 라벨 필터에 filename을 프롬테일에 설정한 파일명으로 변경합니다. 빌더를 사용하면 LogQL을 자동으로 완성해줍니다. 완성된 쿼리를 실행하여 로그가 잘 조회된다면 성공입니다! 🙌

로키에서 애플리케이션 로그 확인

요약

지금까지 로키와 프롬테일의 관계에 대해 알아보았으며 애플리케이션 로그를 조회하기 위해 필요한 툴을 설치하고 데이터를 시각화 해보았습니다. 본 포스팅에서 진행한 내용을 요약하자면 다음과 같으며 이번 포스팅으로 그라파나를 통해서 로키 로그를 조회하는 방법에 대한 궁금지 해결되셨기를 바랍니다. 👋

  1. 애플리케이션 로그를 파일로 남기기
  2. 액츄에이터에서 로그 파일 조회하기
  3. 프롬테일에서 수집한 로그를 로키로 보내기
  4. 그라파나에 로키 데이터소스 매핑하기
  5. 그라나파에서 로그 조회하기
728x90
반응형
Comments