로그를 json 형식으로 파싱하면 promtail에서 라벨링 작업이 수월해지기에 logback logging framework를 사용하여 json 파싱 작업을 진행하겠다. 그 전에 logback에 대해 알아보자.
Logback은 자바 진영에서 사용되는 대표적인 프레임워크로 구현체 자체로 사용하지는 않고 SLF4J라는 추상 인터페이스를 통해 사용한다. 참고로 Binding 라이브러리와 Logging Framework만 제대로 연결하면 자바 진영의 다른 로깅 프레임워크를 사용할 수 있다.
Logback은 Log4J의 후속작으로 Spring단에서 사용할 때 logback-spring.xml 파일을 resource 패키지 하위에 두면 로그 관련 설정이 가능하다.
Logback을 사용하여 로그를 JSON 형식으로 파싱하여 출력하는 방법은 크게 두 가지가 있다.
이 중 첫 번째 방법이 기능이 더 많은거 같기에 이 방법으로 로그를 파싱해보겠다. 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>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
<timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
appender와 encoder 등의 용어가 생소할 수 있기에 따로 정리해보면 다음과 같다.
Logger logger = LoggerFactory.getLogger(LabApplication.class);