MSA 공부 (Logging Filter) - 8

진병욱·2023년 11월 6일

Spring Cloud MSA 공부

목록 보기
8/20
post-thumbnail

먼저 글 작성에 앞서 해당 시리즈는 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의를 참고하여 필요한 내용들을 정리한 것임을 밝힙니다.

Global Filter

  • 글로벌 필터는 설정상 모든 필터중에 가장 처음과 마지막을 담당

  • application.yml

    spring:
      application:
        name: apigateway-service
      cloud:
        gateway:
          default-filters:
            - name: GlobalFilter # default filter를 넣어줌으로써 모든 route에 적용
              args: # 해당 필터에 적용되는 arguments
                baseMessage: Spring Cloud Gateway Global Filter
                preLogger: true
                postLogger: true        
  • GlobalFilter.java

    @Component
    @Slf4j
    public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
    
        public GlobalFilter() {
            super(Config.class);
        }
    
        @Override
        public GatewayFilter apply(Config config) {
            return (exchange, chain) -> {
                ServerHttpRequest request = exchange.getRequest();
                ServerHttpResponse response = exchange.getResponse();
    
                log.info("Global filter: request id -> {}", config.getBaseMessage());
    
                if (config.isPreLogger()) {
                    log.info("Global PRE Filter Start: request id -> {}", request.getId());
                }
    
                return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                    if (config.isPostLogger()) {
                        log.info("Global POST Filter End: response code -> {}", response.getStatusCode());
                    }
                }));
            };
        }
    
        @Data
        public static class Config {
            private String baseMessage;
            private boolean preLogger;
            private boolean postLogger;
        }
    
    }

Logging Filter

  • 로그를 위한 필터

  • LoggingFilter.java

    @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: request id -> {}", config.getBaseMessage());
    
                if (config.isPreLogger()) {
                    log.info("Logging PRE Filter: request id -> {}", request.getId());
                }
    
                return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                    if (config.isPostLogger()) {
                        log.info("Logging POST Filter: response code -> {}", response.getStatusCode());
                    }
                }));
            }, Ordered.LOWEST_PRECEDENCE); // 이 부분의 값을 변경하여 해당 필터의 우선순위를 변경할 수 있음
            // Ordered.LOWEST_PRECEDENCE : 낮은 우선 순위
            // Ordered.HIGHEST_PRECEDENCE : 높은 우선 순위
    
            return filter;
        }
    
        @Data
        public static class Config {
            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 : second-service
              uri: lb://SECOND-SERVICE
              predicates:
                - Path=/second-service/**
              filters:
                - name: LoggingFilter
                  args:
                    baseMessage: Hi, there.
                    preLogger: true
                    postLogger: true
profile
새로운 기술을 접하는 것에 망설임이 없고, 부족한 것이 있다면 항상 배우고자 하는 열정을 가지고 있습니다!

0개의 댓글