간단하게 요청에 대한 로그를 남기는 필터를 구현해 봤다.
@Slf4j
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("log filter init");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String uuid = UUID.randomUUID().toString();
try{
log.info("request = {}", httpRequest);
log.info("uuid = {}", uuid);
log.info("url = {}", httpRequest.getRequestURL());
log.info("uri = {}", httpRequest.getRequestURI());
chain.doFilter(request, response);
} catch (Exception e){
throw e;
} finally {
log.info("response = {}", httpResponse);
log.info("uuid = {}", uuid);
log.info("url = {}", httpResponse.getStatus());
}
}
@Override
public void destroy() {
log.info("log filter destroy");
}
}
필터를 구현해 줬다.
init(), destroy는 서블릿 컨테이너 시작할 때, 끝날 때 사용되는 로직이라 일단 넘어가고,
먼저 인터페이스로 ServletRequest 되어 있는걸 HttpServletRequest 기능을 사용할 수 있게 형변환 해준다.
uuid는 로그에서 요청간의 구분을 위해 남겨놓은 것이다. 저렇게 response랑 같이 남겨 놓으면 짝을 추적할 수 있다.
try 안에 필터 로직을 적고,
catch 예외 처리 해 두고,
finaly는 저 chain.doFilter(request, response)는
Http 요청 -> WAS -> 필터 1 -> 필터 2 -> .... -> 디스패처서블릿 -> 컨트롤러
이렇게 쭉 가는거기 때문에 꼭 chain.doFilter()를 해줘야 한다. 안그럼 그냥 딱 이 필터만 실행하고 끝난다.
마지막 필터 -> 디스패쳐 서블릿
이 흐름으로 가는거기 때문에 꼭 chain.doFilter()를 해줘야 한다.
finaly는 저 흐름을 다 거치고 나면 마침내 해줘야 할 것, 그러니까 마지막으로 해 줘야 할 것을 정의해 주는 곳 이기 때문에
결국 컨트롤러를 거친 response가 나오는 거기 때문에 response에 대한 log를 남기도록 했다.
참고로, 위에 보면 내가 구현 한 필터 뿐만 아니라 다른 컨트롤러나 도메인에서 확인 차 남겨뒀던 로그들을 확인 할 수 있다.
하지만 저게 클라이언트 별로 DB의 순서라던지 로직을 지나는 데 시간 차이가 있을 수 있기 때문에,
클라이언트가 여러 명 이라면 사실 어느 클라이언트의 로그인지 구분하기 어려울 수 있다.
그럴 때, 한 요청이 남기는 로그들이라면 그 로그 모두 들에게 내가 특별히 무언가 더 추가로 덧붙이면서 로그를 남기도록 할 수 있다.
그게 위처럼 uuid라면 어떤 사용자의 로그들인지 구분할 수 있다.
logback mdc
https://dev-jwblog.tistory.com/126
대충 logback.xml로 덧붙일 로그에 대한 포맷, 정보들의 설정을 하고,
AOP를 통해서 하는 듯.
'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글
57. 스프링 인터셉터 (0) | 2023.09.09 |
---|---|
56. 인증 체크 필터 구현 (0) | 2023.09.09 |
54. 필터, 인터셉터 (0) | 2023.09.08 |
53. 세션 정보 확인과 타임아웃 설정 (0) | 2023.09.07 |
52. 스프링 세션 업그레이드 (0) | 2023.09.07 |