본문 바로가기
모티터링도구

loki logback appender 란?

by 아이티.파머 2025. 9. 10.
728x90

loki logback appender란?

opentelemetry logback appender는 https://opentelemetry.io/docs/zero-code/java/spring-boot-starter/out-of-the-box-instrumentation/ Open Source 재단에서 만들고 제공하는 라이브러리로 중앙 집중형태의 collector 만들때 사용한다고 언급하였다.

 

오늘 알아볼 loki logback appender 는 여기서 확인 할 수 있다.

https://loki4j.github.io/loki-logback-appender/

 

Loki4j Logback · Pure Java Logback appender for Grafana Loki

Pure Java Logback appender for Grafana Loki

loki4j.github.io

 

https://github.com/loki4j/loki-logback-appender

 

GitHub - loki4j/loki-logback-appender: Fast and lightweight implementation of Logback appender for Grafana Loki

Fast and lightweight implementation of Logback appender for Grafana Loki - loki4j/loki-logback-appender

github.com

 

 

공식적으로 Opentelemetry 에서 제공하는기능은 아니며 , 커뮤니티 중심 버전이다. (직역..;)

해당 프로젝트를 사용하게된 계기는 server less 로 서비스 아키텍처를 구성하였을때,

GCP 의 Cloud run , AWS의 fargate 같은 container 기반 서버리스 아키텍처에서 side car를 사용 할 수 없을때 사용할 수 있다.

즉, loki에서 공식적으로 제공하는 promtail (https://grafana.com/docs/loki/latest/send-data/promtail/installation/) 클라언트를 사요할수 없을 경우 다른 대안을 찾기위해 리서치 하게 되었다.

 

[그림1] - (2)promtail 과 (1)loki log appener 사용 그림

 

[그림1] 의 (1)직접전송에서 보다 싶이 ServerA 에서 즉시 Loki 서버로 로그를 전송 한다.

 

gradle

implementation("com.github.loki4j:loki-logback-appender:2.0.0") // loki log 전송

 

logback.xml 예제

 

 

Loki4j Logback · Pure Java Logback appender for Grafana Loki

Pure Java Logback appender for Grafana Loki

loki4j.github.io

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
        <http>
            <url>http://${LOKI_IP}:3100/loki/api/v1/push</url>
             <useProtobufApi>false</useProtobufApi>
            <sender class="com.github.loki4j.logback.ApacheHttpSender" />
            <requestTimeoutMs>10000</requestTimeoutMs>
        </http>
        <message>
            <pattern>%-5level [%thread] %logger{20} [trace=%X{traceId:-},span=%X{spanId:-}] - %msg%n</pattern>
        </message>
        <labels>
            service_name = ${LOKI_SERVICE:-user-service}
            host = ${HOSTNAME:-my-hostname}
            level = %level
            env = ${LOKI_ENV:-development}
            traceId =  %X{traceId:-}
            spanId = %X{spanId:-}
        </labels>
        <structuredMetadata>off</structuredMetadata>
        <batch>
            <maxItems>100</maxItems>
            <timeoutMs>1000</timeoutMs>
        </batch>
        <verbose>true</verbose>
    </appender>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %clr(%-5level) %clr([${spring.application.name:-}]){yellow} %clr([%15.15t]){faint} %clr([%X{traceId:-},%X{spanId:-}]){magenta} %clr(%-40.40logger{39}){cyan} : %msg%n</pattern>
        </encoder>
    </appender>

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

</configuration>

주요 옵션

http

    • useProtobufApi : json string이 아니라 buffer 방식이라 속도가 빠르다고 한다.
      • 사용하려하면 Class가 없다고 오류가 납니다.
      • Beta version을 사용하려면 아래 라이브러리를 추가합니다.

implementation("com.github.loki4j:loki-protobuf:0.0.2_pb4.31.0"

  • ApacheHttpSender : ApacheHttpSender를 사용한다. 기본 JavaHttpSender 보다 안정적이다.
  • requestTimeoutMs : 전송에대한 타임아웃 시간

batch

maxItem (1000개)의 로그가 쌓이거나 timeoutMs(60초)가 지나면 Loki로 log를 전송한다

  • maxItem : 기본값은 1000이며 데이터 1000개가 쌓이면 로그를 전송한다.
  • timeoutMs : 기본값은 60초 이며 60초가 지나면 서버로 로그를 전송한다.

VM Option 변수 추가

  • logback.xml 에서 사용중인 env를 사용하기 위해 값을 추가한다.

docker 를 사용하거나 일반 OS에 환경변수로 넣어서 사용 할 수도 있다.

Console 및 Loki 로그 확인

Console에서 발생된로그 ce290221297b9576a603d42b62cc2d11 를 로키에서도 확인 할 수 있다.