일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Strimzi
- propogation
- slow query
- Debezium
- 스프링부트
- minreplica
- Kafka
- SW Maestro
- zset
- 동등성
- MSSQL
- traceId
- eks
- Software maestro
- Grafana
- 0 replica
- logback
- Kubernetes
- Salting
- Benchmarks
- Leaderboard
- blue-green
- spring boot
- Helm
- docket
- yml
- keda
- Database
- hammerDB
- SW 마에스트로
- Today
- Total
김태오
스프링 부트 로그에 특정 로그 제외시키기 본문
스프링 부트 로그에 너무 많은 로그가 쌓여 로그를 뒤져 오류를 찾는 등 작업을 하고 싶을 때 불편한 경우가 있다. 혹은 최대 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 등을 넣어주었다.
'Spring Boot' 카테고리의 다른 글
SQL Server jdbc 라이브러리 조작을 통한setSendStringParametersAsUnicode=false 옵션 무시 (0) | 2025.01.26 |
---|---|
Hibernate Slow Query logging 및 yaml, properties 파일 동작 방식에 관하여 (0) | 2024.07.15 |
FeignClient 사용시 PATCH method 가 안되는 오류 (0) | 2024.03.11 |
async 작업 시 thread 의 traceId 전파 (0) | 2024.03.09 |
동일성과 동등성 (0) | 2023.11.29 |