Logging Filter 는 필터 수행 과정중 발생하는 행위에 대한 로그를 남기기 위한 필터입니다.
Logging Filter 도 기존의 Filter 들과 같이 AbstractGatewayFilterFactory
를 상속받아 구현하게 됩니다.
Logging Filter의 우선순위를 가장 낮게 하여 생성
Global Filter → Custom Filter → Logging Filter 순으로 실행되며 종료될 때는 역순으로 종료되게 Filter 우선순위를 지정
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
를 생성*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 등을 활용해서 우선순위를 지정할 수 있으며 숫자가 클 수록 작은 우선순위를 지닌다는 의미application.yml
수정
second-service
의 filters
부분을 수정하여 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
를 함께 입력해 줄 수 있음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