1 분 소요

이 전에 살펴본 Global Filter를 로깅 출력에 적용해보자.

코드

apigateway-service

filter/LoggingFilter.java

이 전에 만든 GlobalFilter와 같은 위치에 LoggingFilter를 생성한다.

@Component
@Slf4j
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {

    public LoggingFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        GatewayFilter filter = new OrderedGatewayFilter((exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            ServerHttpResponse response = exchange.getResponse();

            log.info("Logging Filter baseMessage: {}", config.getBaseMessage());

            if (config.getPreLogger()) {
                log.info("Logging Pre Filter: request id -> {}", request.getId());
            }

            return chain.filter(exchange)
                .then(Mono.fromRunnable(() -> {
                    if (config.getPostLogger()) {
                        log.info("Logging Post Filter: response id -> {}", response.getStatusCode());
                    }
                }));
        }, Ordered.HIGHEST_PRECEDENCE);

        return filter;
    }

    @Data
    public static class Config {
        // configuration 정보를 넣기
        private String baseMessage;
        private Boolean preLogger;
        private Boolean postLogger;
    }
}

application.yml

...
spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args:
            baseMessage: Spring Cloud Gateway Global Filter
            preLogger: true
            postLogger: true
      routes:
        - id: first-service
          uri: http://localhost:8081/ 
          predicates:
            - Path=/first-service/** 
          filters:
            - CustomFilter # 전달할 파라미터 없으면 name 생략 가능
        - id: second-service
          uri: http://localhost:8082/
          predicates:
            - Path=/second-service/**
          filters:
            - name: CustomFilter
            - name: LoggingFilter # 🌟 LoggingFilter 추가
              args:
                baseMessage: Hi, there.
                preLogger: true
                postLogger: true

포스트맨 결과

포스트맨을 통해 http://localhost:8000/first-service/check에 접속해보자.
apigateway-service의 콘솔에 아래와 같은 로그가 찍힌다.
스크린샷 2022-09-28 오전 12 52 35

이번에는, 이어서 http://localhost:8000/second-service/check에 접속해보자.
application.yml에서 second-service에는 LoggingFilter를 적용했기 때문에, first-service와는 다르게 나타날 것이다.
스크린샷 2022-09-28 오전 1 14 07
스크린샷 2022-09-28 오전 12 59 46
그런데, 이는 위 사진처럼 Global -> Custom -> Logging -> Logging -> Custom -> Global 의 순서가 아니다.
순서가 Logging -> Global -> Custom -> Custom -> Global -> Logging 의 순서로 실행된 이유는 아래와 같다.

GatewayFilter filter = new OrderedGatewayFilter((exchange, chain) -> {...}, Ordered.HIGHEST_PRECEDENCE);

아까 LoggingFilter를 생성하면서 우선순위를 HIGHEST_PRECEDENCE로 지정했기 때문에
LoggingFilter가 제일 먼저 실행 된 것이다.

이처럼 필터의 우선순위를 변경할 수 있다.
만약 LoggerFilter의 우선순위를 가장 낮게 Ordered.LOWEST_PRECEDENCE로 변경한다면,
예상대로 Global -> Custom -> Logging -> Logging -> Custom -> Global 의 순서로 실행될 것이다.



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기