SpringCloudGateway - 记录传入请求 url 和相应的路由 URI

Jav*_*Net 8 spring spring-boot spring-cloud spring-cloud-gateway

我是 Spring Cloud Gateway 的新手,我想要的是将传入请求记录到相应的路由 url,例如,如果我有以下路由配置:

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

然后对于“ http://localhost:8080/foo/route1 ”的传入请求,应打印以下日志消息。

“传入请求 url ' http://localhost:8080/foo/route1 ' 被路由到 ' http://localhost:8585/route1 '”

有什么简单的方法可以实现这一点,或者我可以通过设置日志级别来实现这一点。

你能帮忙吗

use*_*883 11

从 spring cloud gateway 2.2 开始,请尝试以下开关:

logging:
  level:
    reactor:
      netty: INFO
    org:
      springframework:
        cloud:
          gateway: TRACE
spring:
  cloud:
    gateway:
      httpclient:
        wiretap: true
      httpserver:
        wiretap: true
Run Code Online (Sandbox Code Playgroud)

更多信息请参考这里,spring cloud gateway日志级别

  • 刚刚完成,没用,目标路径从未明确记录,基本上很多默认的 toString() 类显示在无限长的行中,有趣的是有关如何完成匹配的信息,我期望的是非常简单的东西: INPUT_METHOD INPUT_URL OUTPUT_METHOD 输出 URL HTTP_STATUS 响应,继续搜索。 (4认同)

spe*_*ibb 8

你可以用一个简单的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在日志中产生以下内容。

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
Run Code Online (Sandbox Code Playgroud)

  • 我必须将 @Component 添加到类中才能使其正常工作 (7认同)
  • 过滤器记录两次,我不知道为什么,对这个问题有什么想法吗? (2认同)
  • @user792883 使用此代码检索 URI:`String originalUri = uris.isEmpty()) ?Exchange.getRequest().getURI().toString() : uris.iterator().next().toString();` (2认同)