본문 바로가기

프로그래밍/Java

logback 필터 - 쓰레드명 혹은 특정 내용만 필터링하기 (로그백 커스텀 필터 구현)

반응형

로그백 커스텀 필터를 만들어주세요

맡고 있는 여러 시스템 중 하나는 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>

실행 결과, 원하는대로 잘 작동한다.

참고 문서

개발 시 로그백 필터 공식 문서를 참고하였다.

https://logback.qos.ch/manual/filters.html

반응형

개발자가 그리는 인스타툰 팔로우하세요!