Spring Cloud Gateway - Logging Filter

| Logging Filter


 

참고: https://mangchhe.github.io/springcloud/2021/04/18/SpringCloudGateway/

 

[Spring Cloud] Gateway로 Filter, LoadBalancer 구현

Spring Cloud Gateway를 구현하는 방법부터 여러 종류의 필터들과 로드밸런싱 적용에 대해서 알아보자

mangchhe.github.io

 

LoggingFilter.java

package com.kyhslam.apigatewayservice.filter;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@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.isPreLogger()) {
                log.info("Logging PRE Filter Start: request id -> {}", request.getId());
            }

            //Custom Post Filter
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                if(config.isPostLogger()) {
                    log.info("Logging POST Filter End: response code -> {} ", response.getStatusCode());
                }
            }));
        }, Ordered.LOWEST_PRECEDENCE); // 우선순위 지정할 수 있다
        //HIGHEST_PRECEDENCE

        return filter;
    }

    @Data
    public static class Config {
        private String baseMessage;
        private boolean preLogger;
        private boolean postLogger;
    }

}

application.yml

server:
  port: 8000

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:8761/eureka

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
        - id: second-service
          uri: http://localhost:8082/
          predicates:
            - Path=/second-service/**
          filters:
            - name: CustomFilter
            - name: LoggingFilter
              args:
                baseMessage: Hi, there.
                preLogger: true
                postLogger: true

 

second service에만 LoggingFilter를 적용하였다

 

테스트 결과

'📚 Spring > Spring Cloud' 카테고리의 다른 글

SpringCloud의 이해  (0) 2022.01.28
Spring Cloud Gateway - Load Balancer  (0) 2021.09.29
Spring Cloud Gateway - Global Filter  (0) 2021.09.27
Spring Cloud Gateway - Custom Filter  (0) 2021.09.27
Spring Cloud Gateway - Filter  (0) 2021.09.24

댓글

Designed by JB FACTORY