SpringCloudGateway - регистрирует URL входящего запроса и соответствующий URI маршрута

Я новичок в весеннем облачном шлюзе, я хочу регистрировать входящий запрос на соответствующий URL-адрес маршрута, например, если у меня следующая конфигурация маршрута:

      - id: route1
        uri: http://localhost:8585/
        predicates:
        - Path=/foo/**
        filters:
        - RewritePath=/foo/(?<segment>.*), /$\{segment}

Затем для входящего запроса «http: // локальный: 8080 / foo / route1» должно быть напечатано следующее сообщение журнала.

«URL входящего запроса 'http: // локальный: 8080 / foo / route1' направляется на 'http: // локальный: 8585 / маршрут1

Есть ли простой способ добиться этого, или я могу добиться этого, просто установив уровень журнала.

Не могли бы вы помочь

10
0
14 083
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете сделать это с помощью простого 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

Фильтр регистрирует два раза, я не знаю почему, какое-то представление об этой проблеме?

Diego 03.10.2019 23:32

Я настроил несколько маршрутов, но он всегда печатает «Неизвестно», например: Входящий запрос Неизвестный направляется на id: 98bad84c-6b31-46f4-84ec-915e02f921a5, uri: локальный: 8080 / bootstrap.css.map

bzhu 15.10.2019 16:02

@ user792883 используйте этот код для получения URI: String originalUri = uris.isEmpty()) ? exchange.getRequest().getURI().toString() : uris.iterator().next().toString();

bvn13 27.11.2019 21:17

Мне пришлось добавить @Component в класс, чтобы он заработал

John Mercier 28.07.2021 20:08

Начиная с Spring Cloud Gateway 2.2 попробуйте следующие переключатели:

logging:
  level:
    reactor:
      netty: INFO
    org:
      springframework:
        cloud:
          gateway: TRACE
spring:
  cloud:
    gateway:
      httpclient:
        wiretap: true
      httpserver:
        wiretap: true

подробнее см. здесь, уровни журнала весеннего облачного шлюза

Только что сделано, бесполезно, целевой путь никогда явно не регистрируется, и в основном многие классы toString () по умолчанию показаны в бесконечной длинной строке, что интересно, это информация о том, как выполняется сопоставление, я ожидаю что-то довольно простое: INPUT_METHOD INPUT_URL OUTPUT_METHOD OUTPUT URL HTTP_STATUS RESPONSE, продолжайте поиск.

tonio 21.01.2021 18:17

Поддерживает ли SCG AdvancedByteBufFormat.TEXTUAL projectreactor.io/docs/netty/release/reference/…?

Rajesh Vyas 27.02.2021 18:40

@RajeshVyas: проверьте ответ ниже

Akshay Shinde 02.07.2021 17:32

Я нашел решение ниже, попробуйте:

application.yml

logging:
    level:
        reactor:
            netty: INFO
        org:
            springframework:
                cloud:
                    gateway: INFO

Конфигурация компонента:

@Bean
HttpClient httpClient() {
    return HttpClient.create().wiretap("LoggingFilter", LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL);
}

Акшай

Могу ли я записывать только заголовок?

study_20160808 03.09.2021 12:16

Я этого не пробовал. Точно сказать не могу.

Akshay Shinde 23.09.2021 09:11

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