로그백 커스텀 필터를 만들어주세요
맡고 있는 여러 시스템 중 하나는 jdbc.sqlonly를 INFO 레벨로 설정하고 있다. jdbc.sqlonly를 INFO레벨로 하면 파라미터가 바인딩 된 쿼리 전문이 남아서 로그양이 꽤 되지만, 장애 발생시 문제 파악을 위해 운영에서도 INFO 레벨로 설정하는 경우가 꽤 있다.
그런데 스케줄러에서 실행되는 쿼리가 1분마다 찍히고 있어서 운영하는 측에서 수정 요청이 들어왔다. 스케줄은 스프링 @Scheduled 어노테이션을 사용하여 구현하였고 별도의 커스텀 TaskScheduler를 정의하지 않았으므로 poolScheduler라는 prefix가 들어간다.
이에, Thread 이름으로 필터링을 하고자 시도하였다. 그런데 당연히 기본 기능으로 그런 필터링 기능이 제공될 줄 알았는데, 기본 필터로 해당 요구사항 구현은 불가능하였다.
쓰레드 이름으로 필터링하기
LogbackThreadNameFilter.java
ch.qos.logback.core.filter.Filter
인터페이스를 구현한 커스텀 필터를 생성하였다. ILoggingEvent
이벤트에서 쓰레드명, 로거명(예: jdbc.sqlonly), 로그내용, 포맷팅 된 로그내용 등 로그백에 원하는 대부분의 내용을 가져올 수 있으므로 손쉽게 필터를 구현할 수 있었다.
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class LogbackThreadNameFilter extends Filter<ILoggingEvent> {
private final String schedulerThreadContains = "Scheduler";
@Override
public FilterReply decide(ILoggingEvent event) {
// @Scheduled 메소드에서 찍는 로그는 기록하지 않는다.
String threadName = event.getThreadName();
return threadName.contains(schedulerThreadContains) ? FilterReply.DENY : FilterReply.NEUTRAL;
}
}
logback-spring.xml
logback-spring.xml 파일의 appender 설정에 다음 한 줄을 추가해주었다.
<filter class="com.myproject.config.LogbackThreadNameFilter"/>
appender 전체 모습을 보면 다음과 같다.
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${catalina.base}/logs/apc.gateway.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<filter class="com.myproject.config.LogbackThreadNameFilter"/>
<encoder>
<charset>utf-8</charset>
<Pattern>%d %-5level [%thread] %logger{0}: %msg%n</Pattern>
</encoder>
</appender>
실행 결과, 원하는대로 잘 작동한다.
참고 문서
개발 시 로그백 필터 공식 문서를 참고하였다.
'프로그래밍 > Java' 카테고리의 다른 글
Spring 로그백 RollingFileAppender와 AsyncAppender 차이, logback-spring.xml 설정 예시 (0) | 2023.03.28 |
---|---|
No thread-bound request found (2) | 2021.09.16 |
ajax 에러 json 메세지 받기 (Spring Security, axios) (0) | 2020.12.01 |
Oracle/JDBC 해당 위치에 지원되지 않는 SQL92 토큰: 43 (0) | 2020.07.22 |
JSTL: 서버단 코딩 없이 네이버 블로그 RSS로 포스트 목록 가져오기 (1) | 2020.07.17 |