쌓고 쌓다

[스프링 부트] 모든 요청 로그 남기기(필터) - 28 본문

프로그래밍/spring

[스프링 부트] 모든 요청 로그 남기기(필터) - 28

승민아 2023. 9. 10. 14:42

서블릿 필터로 모든 요청 로그를 남겨보자.

서블릿 필터에 대한 포스팅은 작성한 적 있다.

https://non-stop.tistory.com/587

 

LogFilter - 로그 필터

package com.example.board.filter;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.UUID;

@Slf4j
public class LogFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("log filter init");
    }

    @Override
    public void destroy() {
        log.info("log filter destroy");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String requestURI = httpServletRequest.getRequestURI();

        String uuid = UUID.randomUUID().toString();
        try {
            log.info("REQUEST [{}][{}]", uuid, requestURI);
            chain.doFilter(request, response);
        } catch (Exception e) {
            throw e;
        } finally {
            log.info("RESPONSE [{}][{}]", uuid, requestURI);
        }
    }
}

 

필터 인터페이스를 구현하여 필터를 사용할 수 있다.

  • doFilter : HTTP 요청시 doFilter가 호출된다.
  • uuid : HTTP 요청을 구별하기 위해 임의의 uuid를 생성하여 사용한다.
    • REQUEST "uuid" "requestURI"로 요청URI를 남긴다.
  • chain.doFilter : 이 부분을 통해 다음 필터가 있으면 필터를 호출하고 필터가 없으면 서블릿을 호출한다.
    • doFilter 부분이 없다면 다음 단계로 진행되지 않으니 주의!

 

WebConfig - 필터 설정

package com.example.board;

import com.example.board.filter.LogFilter;
import jakarta.servlet.Filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean logFilter() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(new LogFilter());
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }
}

스프링 부트를 사용한다면 FilterRegisterationBean을 사용해서 등록하면 된다.

  • setFilter : 등록할 필터
  • setOrder : 필터 체인 순서 등록. 낮을 수록 먼저 동작
  • addUrlPatterns : 필터를 적용할 URL 패턴 지정

 

 

필터 로그 결과

Comments