Spring Boot 2.5.4项目执行HTTP重定向时@Slf4j日志未输出问题
问题现象
Spring Boot 2.5.4项目中定义了如下GET接口,当接口触发302重定向逻辑时,代码内所有手动打印的日志都不会写入日志文件,但返回404等错误响应时日志输出完全正常。
接口代码如下:
@GetMapping(value = "/login/{clientId}", produces = {"text/plain"}) public final ResponseEntity<String> login(@PathVariable String clientId, @RequestParam(required = false) String callbackUrl, HttpServletRequest httpRequest) { log.info("login called, clientId={}, callbackUrl={}", clientId, callbackUrl); // 参数校验 AppProperties.ClientInfo clientInfo = appProperties.getClientInfoById(clientId); if (clientInfo == null) { log.warn("No ClientInfo found for clientId={}", clientId); return new ResponseEntity<>("No ClientInfo found for clientId=" + clientId, HttpStatus.NOT_FOUND); } String redirectUrl = makeBrokerUrl(appProperties, clientInfo, callbackUrl, httpRequest); log.info("Redirect client to {}", redirectUrl); HttpHeaders headers = new HttpHeaders(); headers.setLocation(URI.create(redirectUrl)); return new ResponseEntity<>(headers, HttpStatus.valueOf(302)); }
log对象由类上标注的@Slf4j注解生成。
已确认测试结果
- 请求不存在的clientId(如
/login/2)时,info级别的请求接入日志、warn级别的错误日志均可正常输出。 - 请求存在的clientId(如
/login/1)触发重定向时,无任何日志输出,问题和重定向逻辑直接相关。
根因分析
按照出现概率从高到低排序:
- 前置网关/反向代理直接返回重定向,请求未到后端服务
这是最高概率的原因。如果Nginx、API网关等前置节点配置了匹配/login/1的重定向规则,请求会直接由前置节点返回302响应,根本不会转发到Spring Boot服务,Controller代码全程不执行,自然不会有日志。你可以通过在Controller方法首行加断点、或者查询前置节点的访问日志确认请求是否到达后端。 - 请求命中缓存,未进入Controller逻辑
如果接口配置了HTTP缓存(比如加了@Cacheable注解、或者全局拦截器对302响应做了缓存),后续同参数请求会直接从缓存返回,不会执行Controller代码,也就不会打印日志。你可以清理缓存后重新测试,或者给请求加随机参数排除缓存影响。 - 全局拦截器/过滤器提前返回重定向
如果项目中配置了全局拦截器、过滤器,在请求进入Controller之前做了校验逻辑,符合条件的请求直接被返回302重定向,也会导致Controller代码不执行。你可以在拦截器/过滤器的前置处理逻辑中加日志排查。 - 异步日志缓冲区未刷盘
如果你的日志框架配置了异步输出,且缓冲区设置较大,重定向场景下请求结束后缓冲区没有立刻刷入磁盘,会导致日志延迟显示。你可以临时切换为同步日志配置测试,或者等待一段时间后再查询日志文件。
排查步骤
- 先在Controller方法首行加断点,发起重定向场景的请求,确认是否真的进入了方法。如果断点未触发,直接排查前置网关、拦截器、缓存逻辑。
- 如果断点正常触发,在日志打印行加断点,确认log对象正常、对应类的日志级别为info。
- 临时修改日志配置为同步输出,测试重定向场景是否有日志,排除异步缓冲区的问题。
内容的提问来源于stack exchange,提问作者Peter Sone Koldkjær
相关产品推荐
相关产品推荐

