logback을 활용하여 로그를 json 형식으로 파싱하기 [로그 시스템 3]

Hyeok_Choi·2024년 1월 4일
0

로그 시스템

목록 보기
3/4

Intro

로그를 json 형식으로 파싱하면 promtail에서 라벨링 작업이 수월해지기에 logback logging framework를 사용하여 json 파싱 작업을 진행하겠다. 그 전에 logback에 대해 알아보자.

Logback

Logback은 자바 진영에서 사용되는 대표적인 프레임워크로 구현체 자체로 사용하지는 않고 SLF4J라는 추상 인터페이스를 통해 사용한다. 참고로 Binding 라이브러리와 Logging Framework만 제대로 연결하면 자바 진영의 다른 로깅 프레임워크를 사용할 수 있다.

Logback은 Log4J의 후속작으로 Spring단에서 사용할 때 logback-spring.xml 파일을 resource 패키지 하위에 두면 로그 관련 설정이 가능하다.

Logback - JSON 파싱

Logback을 사용하여 로그를 JSON 형식으로 파싱하여 출력하는 방법은 크게 두 가지가 있다.

  1. JsonLayout와 JacksonJsonFormatter 사용
  2. JsonEncoder 사용

이 중 첫 번째 방법이 기능이 더 많은거 같기에 이 방법으로 로그를 파싱해보겠다. JsonLayout과 JacksonJsonFormatter를 사용하기 위해 주입받아야 할 의존성은 다음과 같다.

dependencies {
    implementation 'ch.qos.logback.contrib:logback-json-classic:0.1.5'
    implementation 'ch.qos.logback.contrib:logback-jackson:0.1.5'
	implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
}

(참고로 logback-jacson 라이브러리는 logback-core와 logback-classic 라이브러리를 의존하기에 의도적으로 명시한다고 하면 버저닝에 신경써야 한다. spring boot starter logging 프레임워크도 의존하기 때문이다)

이후 logback-springl.xml 파일에 appender 내부 JSON 파싱 관련 encoder를 아래와 같이 구성하면 JSON 형식으로 파싱할 수 있다.

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
            <prettyPrint>false</prettyPrint>
        </jsonFormatter>
    </layout>
</encoder>
  • timestampFormat을 통해 날짜 및 시각에 관한 포멧을 설정할 수 있다.
    • 만약 타임존 정보까지 기입하고 싶으면 아래와 같이 설정하면 된다.
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
<timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
  • appendLineSeparator를 통해 각 로그별 \t\n한다.
  • prettyPrint를 true로 설정하면 사람이 읽기 좋게 포멧팅된다. 지금은 한 줄 별로 로그를 구분해서 로그 시스템에 보내야 하기에 false로 설정했다.
  • jsonFormatter를 설정하지 않으면 json 파싱은 되지만 각 key, value에 큰따옴표가 기입되지 않는다. (이거때문에 얼마나 고생했는지;)

결과

간단하게 logback 설정 요소 정리

appender와 encoder 등의 용어가 생소할 수 있기에 따로 정리해보면 다음과 같다.

  • Logger
    • 실제 로깅을 수행하는 구성요소로 다음과 같이 사용한다.
      Logger logger = LoggerFactory.getLogger(LabApplication.class);
      로그 레벨은 총 5단계로 조절 가능하다.
  • Appender
    • Logback이 Logging Event를 발행하도록 위임하는 객체이다.
  • Encoder
    • Appender가 지정한 대상에 실제 로그 이벤트를 바이트 배열로 변환하고, OutputStream으로 쓰는 작업을 수행한다.

참고

profile
Backend-Developer

0개의 댓글