Post

Backend - Spring boot Filter를 이용한 로깅 설정에 대하여 알아보자

Backend - Spring boot Filter를 이용한 로깅 설정에 대하여 알아보자

Filter VS Interceptor

Spring boot를 사용하면서 로깅을 설정할 때 보통 FilterInterceptor에 로깅을 설정한다.

Spring AOP를 사용하기도 한다.

이때, FilterInterceptor에 차이는 아래와 같다.

  • FilterServlet Container 수준에서 동작한다.
  • InterceptorDispatcherServletController 중간에 존재한다.

따라서, Filter는 요청과 응답에 로깅을 설정하고, Interceptor는 주로 인증/인가 처리, 컨트롤러 진입 전/후의 로직 처리, 로깅 등을 위해 사용된다.

Filter를 이용한 로깅 설정

servlet에서 제공하는 Filter 인터페이스를 구현하여 처리하였다.

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
29
30
@Component
@Slf4j
public class LoggingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        long startedTime = System.currentTimeMillis();

        log.info("=================================================>>");
        log.info("URL : {} ",request.getRequestURL());
        log.info("HTTP_METHOD : {}", request.getMethod());
        log.info("URI : {}", request.getRequestURI());
        log.info("QUERY : {}", request.getQueryString());
        log.info("CONTENT_TYPE : {}", request.getContentType());
        log.info("=================================================>>");

        filterChain.doFilter(servletRequest, servletResponse);

        long endedTime = System.currentTimeMillis() - startedTime;

        log.info("<<=================================================");
        log.info("RESPONSE_ENDED_TIME : {}", endedTime);
        log.info("RESPONSE_STATUS : {}", response.getStatus());
        log.info("RESPONSE_CONTENT_TYPE : {}", response.getContentType());
        log.info("<<=================================================");
    }
}

ServletRequest, ServletResponseHttpServletRequest, HttpServletResponse로 형변환하여 사용하였다.

HttpServletRequestHttpServletResponse는 각각 ServletRequest, ServletResponse의 하위 인터페이스로 HTTP 프로토콜에 초점이 맞춰져있다.

구동 결과

loggingResult

This post is licensed under CC BY 4.0 by the author.