Backend - Spring boot Filter를 이용한 로깅 설정에 대하여 알아보자
Backend - Spring boot Filter를 이용한 로깅 설정에 대하여 알아보자
Filter VS Interceptor
Spring boot를 사용하면서 로깅을 설정할 때 보통 Filter와 Interceptor에 로깅을 설정한다.
Spring AOP를 사용하기도 한다.
이때, Filter와 Interceptor에 차이는 아래와 같다.
Filter는Servlet Container수준에서 동작한다.Interceptor는DispatcherServlet과Controller중간에 존재한다.
따라서, 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, ServletResponse를 HttpServletRequest, HttpServletResponse로 형변환하여 사용하였다.
HttpServletRequest와HttpServletResponse는 각각ServletRequest,ServletResponse의 하위 인터페이스로 HTTP 프로토콜에 초점이 맞춰져있다.
구동 결과
This post is licensed under CC BY 4.0 by the author.
