SpringCloudGateway - регистрирует URL-адрес входящего запроса и соответствующий URI маршрута.
Я новичок в Spring Cloud Gateway, что я хочу, чтобы записать входящий запрос на соответствующий URL-адрес маршрута, например, если у меня есть следующая конфигурация маршрута:
- id: route1
uri: http://localhost:8585/
predicates:
- Path=/foo/**
filters:
- RewritePath=/foo/(?<segment>.*), /$\{segment}
Затем для входящего запроса ' http://localhost:8080/foo/route1' должно быть напечатано следующее сообщение журнала.
"URL-адрес входящего запроса ' http://localhost:8080/foo/route1' направляется в ' http://localhost:8585/route1'"
Есть ли простой способ добиться этого или я могу добиться этого, просто установив уровень журнала.
Можете ли вы помочь
4 ответа
Вы можете сделать это с помощью простого GlobalFilter
,
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.net.URI;
import java.util.Collections;
import java.util.Set;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR;
public class LoggingFilter implements GlobalFilter {
Log log = LogFactory.getLog(getClass());
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
Set<URI> uris = exchange.getAttributeOrDefault(GATEWAY_ORIGINAL_REQUEST_URL_ATTR, Collections.emptySet());
String originalUri = (uris.isEmpty()) ? "Unknown" : uris.iterator().next().toString();
Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
URI routeUri = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);
log.info("Incoming request " + originalUri + " is routed to id: " + route.getId()
+ ", uri:" + routeUri);
return chain.filter(exchange);
}
}
производит следующее в журналах.
2019-01-09 15:36:32.422 INFO 6870 --- [or-http-epoll-2] LoggingFilter : Incoming request http://localhost:8080/api/configserver/foo/default is routed to id: CompositeDiscoveryClient_CONFIGSERVER, uri:http://192.168.0.112:8888/foo/default
В Spring Cloud Gateway 2.2 попробуйте следующие переключатели:
logging:
level:
reactor:
netty: INFO
org:
springframework:
cloud:
gateway: TRACE
spring:
cloud:
gateway:
httpclient:
wiretap: true
httpserver:
wiretap: true
подробнее см. здесь, уровни журнала весеннего облачного шлюза
Вы можете просто добавить этот уровень журнала. Сообщения журнала будут более подробными, чем фильтр, но, по крайней мере, вам не нужно создавать класс
приложение.yml:
logging:
level:
org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping: DEBUG
Преимущество решения с фильтром заключается в том, что вы также можете регистрировать, когда маршруты не найдены, изменив на TRACE:
logging:
level:
org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping: TRACE
Я нашел решение ниже, попробуйте:
application.yml
logging:
level:
reactor:
netty: INFO
org:
springframework:
cloud:
gateway: INFO
Конфигурация компонента:
@Bean
HttpClient httpClient() {
return HttpClient.create().wiretap("LoggingFilter", LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL);
}
Акшай