网关全局过滤器的开始结束与耗时日志

zjc 于 2026-08-19 发布

网关是所有请求的入口,也是观察请求生命周期最好的位置。项目实现了 ServiceGlobalFilter,在每个经过网关的请求前后输出日志。

一、GlobalFilter 的位置

@Component
public class ServiceGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange);
    }
}

https://github.com/springvortex/spring-cloud-alibaba/blob/main/service-gateway/src/main/java/com/zjc/gateway/filter/ServiceGlobalFilter.java

它对所有路由生效,不用逐条路由配置。

二、doFinally 覆盖三种结束方式

Reactor 请求可能正常完成,也可能异常终止或被取消。使用 doFinally 可以统一输出结束日志和信号类型:

return chain.filter(exchange)
        .doFinally(signalType -> log.info("结束请求,信号:{}", signalType));

https://github.com/springvortex/spring-cloud-alibaba/blob/main/service-gateway/src/main/java/com/zjc/gateway/filter/ServiceGlobalFilter.java

这比只写成功回调可靠。

三、计时值要可信

开始时间在进入过滤器时记录,结束时间在 doFinally 中计算。耗时覆盖下游调用和后续过滤器链,接近网关处理这次请求的总时间。

四、日志内容保持克制

这里记录方法和 URI,不打印请求体。网关层面打印所有请求体,很容易把密码、上传文件和超长 JSON 写进日志,还会带来内存和 IO 压力。

五、经验总结

网关日志的目标是回答“请求有没有到、走了多久、以什么方式结束”。具体入参出参交给业务服务的 Web 日志切面,两层职责分开。