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);
}

Акшай

Другие вопросы по тегам