【问题标题】:SpringCloudGateway - Log incoming request url and corresponding route URISpringCloudGateway - 记录传入的请求 url 和相应的路由 URI
【发布时间】:2019-06-04 15:16:59
【问题描述】:

我是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'”

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

请帮忙

【问题讨论】:

    标签: spring spring-boot spring-cloud spring-cloud-gateway


    【解决方案1】:

    你可以用一个简单的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
    

    【讨论】:

    • 过滤器记录了两次,不知道为什么,关于这个问题的一些想法?
    • 我配置了一些路由,但是总是打印“Unknown”,例如:Incoming request Unknown is routed to id: 98bad84c-6b31-46f4-84ec-915e02f921a5, uri:localhost:8080/bootstrap.css.map
    • @user792883 使用此代码检索 URI:String originalUri = uris.isEmpty()) ? exchange.getRequest().getURI().toString() : uris.iterator().next().toString();
    • 我必须将@Component 添加到类中才能正常工作
    【解决方案2】:

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

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

    更多信息请参考这里,spring cloud gateway log levels

    【讨论】:

    • 刚刚完成,没用,目标路径从未显式记录,基本上很多默认的 toString() 类显示在无限长的行中,有趣的是有关如何完成匹配的信息,我expect 很简单:INPUT_METHOD INPUT_URL OUTPUT_METHOD OUTPUT URL HTTP_STATUS RESPONSE,继续搜索。
    • SCG 是否支持 AdvancedByteBufFormat.TEXTUAL projectreactor.io/docs/netty/release/reference/…
    • @RajeshVyas : 检查下面的答案
    【解决方案3】:

    我找到了以下解决方案,试试看:

    application.yml

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

    Bean 配置:

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

    阿克谢

    【讨论】:

    • 我可以只记录标题吗?
    • 我没试过。不确定。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2018-10-05
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多