网关是所有请求的入口,也是观察请求生命周期最好的位置。项目实现了 ServiceGlobalFilter,在每个经过网关的请求前后输出日志。
一、GlobalFilter 的位置
@Component
public class ServiceGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange);
}
}
它对所有路由生效,不用逐条路由配置。
二、doFinally 覆盖三种结束方式
Reactor 请求可能正常完成,也可能异常终止或被取消。使用 doFinally 可以统一输出结束日志和信号类型:
return chain.filter(exchange)
.doFinally(signalType -> log.info("结束请求,信号:{}", signalType));
这比只写成功回调可靠。
三、计时值要可信
开始时间在进入过滤器时记录,结束时间在 doFinally 中计算。耗时覆盖下游调用和后续过滤器链,接近网关处理这次请求的总时间。
四、日志内容保持克制
这里记录方法和 URI,不打印请求体。网关层面打印所有请求体,很容易把密码、上传文件和超长 JSON 写进日志,还会带来内存和 IO 压力。
五、经验总结
网关日志的目标是回答“请求有没有到、走了多久、以什么方式结束”。具体入参出参交给业务服务的 Web 日志切面,两层职责分开。