Logging Filter

duckbill413·2024년 7월 30일
0

Spring Cloud

목록 보기
5/10
post-thumbnail

Logging Filter

Logging Filter 는 필터 수행 과정중 발생하는 행위에 대한 로그를 남기기 위한 필터입니다.

Logging Filter 도 기존의 Filter 들과 같이 AbstractGatewayFilterFactory를 상속받아 구현하게 됩니다.

Filter 실행 순서

Logging Filter의 우선순위를 가장 낮게 하여 생성

Global FilterCustom Filter → Logging Filter 순으로 실행되며 종료될 때는 역순으로 종료되게 Filter 우선순위를 지정

Logging Filter 실습

  1. LoggingFilter class 작성

    @Slf4j
    @Component
    public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
        public LoggingFilter() {
            super(Config.class);
        }
    
        /**
         * GatewayFilter의 생성은 OrderedGatewayFilter 를 통해 생성할 수 있다.
         * 현재, Spring 은 Webflux 를 사용하고 있다. Webflux 를 사용할 경우
         * MVC 패턴의 ServletRequest, ServletResponse 를 사용하는 것이 아닌,
         * ServerRequest, ServerResponse 로 동작하며 이 것의 사용을 도와주는 객체가 ServerWebExchange 이다.
         * @param config
         * @return
         */
        @Override
        public GatewayFilter apply(Config config) {
            // Logging Pre Filter
            return new OrderedGatewayFilter((exchange, chain) -> {
                ServerHttpRequest request = exchange.getRequest();
                ServerHttpResponse response = exchange.getResponse();
    
                log.info("Logging Filter baseMessage: {}", config.getBaseMessage());
    
                if (config.isPreLogger()) {
                    log.info("Logging Filter Start: request id -> {}", request.getId());
                }
    
                // Logging Post Filter
                return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                    if (config.isPostLogger()) {
                        log.info("Logging Filter End: response code -> {}", response.getStatusCode());
                    }
                }));
            }, Ordered.LOWEST_PRECEDENCE); // 필터의 실행 순서 설정 (우선 순위)
        }
    
        @Data
        public static class Config {
            private String baseMessage;
            private boolean preLogger;
            private boolean postLogger;
        }
    }
    • 기존의 다른 필터들의 구현 방식과 큰 차이점은 없으나 람다식대신 new OrderedGatewayFilter 를 이용해서 GatewayFilter 를 생성
    • Filter 우선 순위 지정
      *public* OrderedGatewayFilter(
      	org.springframework.cloud.gateway.filter.GatewayFilter delegate, 
      	*int* order
      )int order은 Filter 의 실행 우선순위를 지정하는 부분
      int order은 Filter 의 실행 우선순위를 지정하는 부분
    • Ordered
      public interface Ordered {
          int HIGHEST_PRECEDENCE = -2147483648;
          int LOWEST_PRECEDENCE = 2147483647;
      
          int getOrder();
      }
      Ordered interface 등을 활용해서 우선순위를 지정할 수 있으며 숫자가 클 수록 작은 우선순위를 지닌다는 의미
  2. application.yml 수정

    second-servicefilters 부분을 수정하여 LoggingFilter를 등록

    - id: second-service
      uri: http://localhost:8082/
      predicates:
        - Path=/second-service/**
      filters:
        - AddRequestHeader=second-request, second-request-header2
        - AddResponseHeader=second-response, second-response-header2
        - name: CustomFilter
        - name: LoggingFilter
          args:
            baseMessage: Spring Cloud Gateway LoggingFilter
            preLogger: true
            postLogger: true
    • name을 사용하여 class를 등록하는 작업을 해야만 args를 함께 입력해 줄 수 있음
  3. Logging Filter Test

    Global Filter baseMessage: String Cloud Gateway GlobalFilter
    Global Filter Start: request id -> 7563c5f2-1
    Custom PRE filter: request id -> 7563c5f2-1
    Logging Filter baseMessage: Spring Cloud Gateway LoggingFilter
    Logging Filter Start: request id -> 7563c5f2-1
    Logging Filter End: response code -> 200 OK
    Custom POST filter: response code -> 200 OK
    Global Filter End: response code -> 200 OK
    • request id를 통해 동일한 요청에 대하여 Filter가 걸린 것을 확인
    • GlobalCustomLogging Filter 순으로 실행 종료는 역순
profile
같이 공부합시다~

0개의 댓글