스프링 부트 로그에 특정 로그 제외시키기
스프링 부트 로그에 너무 많은 로그가 쌓여 로그를 뒤져 오류를 찾는 등 작업을 하고 싶을 때 불편한 경우가 있다. 혹은 최대 throughput 이 정해져 있는 AWS CloudWatch 에 로그가 쌓이는 경우 로그 누락 등의 치명적인 문제가 생길 수 있다.
특히 스프링 부트에서 쌓는 로그 뿐만 아니라 쿠버네티스나 ELB 에 배포 후 쌓이는 추가적인 부수 로그들이 있을 때 굳이 로그를 남기지 않는 판단을 할 수 있다.
다음은 간단하게 원하는 로그를 제외시키는 방법이다.
import ch.qos.logback.classic.spi.ILoggingEvent
import ch.qos.logback.core.filter.Filter
import ch.qos.logback.core.spi.FilterReply
class ContentBasedFilter : Filter<ILoggingEvent>() {
override fun decide(event: ILoggingEvent): FilterReply {
val message = event.formattedMessage
if (message.contains("/manage/health") ||
message.contains("kube-probe") ||
message.contains("ELB-HealthChecker")) {
return FilterReply.DENY
}
return FilterReply.NEUTRAL
}
}
ch.qos.logback.classic.spi.ILoggingEvent 은 Logback 에 있는 인터페이스인데, 로깅과 관련된 모든 data 를 담고 있다.
ch.qos.logback.core.filter.Filter 는 Logback 의 abstract class 인데, 간단히 logging event 를 필터링하기 위해 사용한다.
ch.qos.logback.core.spi.FilterReply 는 enum 인데, DENY(이벤트 제외시키기), ACCEPT(이벤트 로깅하기), NEUTRAL(아무 동작하지 않기) 를 선택할 수 있다.
코드에서는 스프링 부트 헬스체크인 /manage/health 엔드포인트 관련 로깅, 쿠버네티스 배포 관련 kube-probe 관련 로깅, ELB 배포 관련 ELB-HealthChecker 로그를 DENY 옵션으로 제외시켰다.
ContentBasedFilter 는 어떤 @Configuration 혹은 @Bean 이 아니기 때문에 xml 설정 파일에 넣어주어야 하는데, 이것이 logback-spring.xml 이다.
<configuration>
<springProperty scope="context" name="application-logging" source="spring.application.name" defaultValue=""/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- Translated pattern from your application.yml -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [${SPRING_APPLICATION_NAME:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] [%15.15t] %-40.40logger{39} : %msg%n%replace(%ex){'\n','\r'}</pattern>
</encoder>
<!-- Apply the custom filter -->
<filter class="${파일 디렉토리).ContentBasedFilter"/>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
기본적인 포맷이다. filter class 에 이전에 만든 파일 경로를 넣어주었으며 pattern 에는 추가 커스텀 로깅을 위해 application.yaml 에서 가져온 SPRING_APPLICATION_NAME 과 traceId, spanId 등을 넣어주었다.