[Spring Cloud Gateway] Logging Filter
이 전에 살펴본 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
의 콘솔에 아래와 같은 로그가 찍힌다.
이번에는, 이어서 http://localhost:8000/second-service/check
에 접속해보자.
application.yml
에서 second-service
에는 LoggingFilter
를 적용했기 때문에, first-service
와는 다르게 나타날 것이다.
그런데, 이는 위 사진처럼 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
의 순서로 실행될 것이다.
💛 개인 공부 기록용 블로그입니다. 👻