如何禁用Spring RestTemplate指定代码段的日志输出
如何减少特定RestTemplate实例的日志输出
一、精准调整日志配置
你当前配置了org.springframework.web.client.RestTemplate=ERROR,但仍有响应内容输出,大概率是其他关联Logger在打印日志。可以添加以下配置关闭请求响应的详细输出:
# 关闭HttpRequestLoggingInterceptor的日志(若存在该拦截器) logging.level.org.springframework.web.client.HttpRequestLoggingInterceptor=OFF # 彻底关闭RestTemplate的所有低级日志 logging.level.org.springframework.web.client.RestTemplate=OFF
注意:Log4j中更具体的Logger配置会覆盖父级配置,所以上述配置优先级高于org.springframework.web:DEBUG。
二、针对当前RestTemplate实例禁用日志
如果你只想让这段代码中的RestTemplate不输出日志,不影响应用内其他RestTemplate实例,可以通过以下方式自定义该实例:
方法1:移除日志拦截器
如果RestTemplate被自动添加了日志拦截器,手动移除即可:
HttpHeaders headers = new HttpHeaders(); RestTemplate restTemplate = new RestTemplate(); // 移除所有日志相关拦截器 restTemplate.getInterceptors().removeIf(interceptor -> interceptor instanceof HttpRequestLoggingInterceptor); headers.setContentType(MediaType.TEXT_PLAIN); HttpEntity<String> entity = new HttpEntity<>(dataToBeSenttoVM, headers); log.info("something"); ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod.POST, entity, String.class);
方法2:使用无日志的请求工厂
创建默认不打印日志的ClientHttpRequestFactory替换RestTemplate的默认工厂:
HttpHeaders headers = new HttpHeaders(); // SimpleClientHttpRequestFactory默认不会输出请求响应日志 SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); RestTemplate restTemplate = new RestTemplate(requestFactory); headers.setContentType(MediaType.TEXT_PLAIN); HttpEntity<String> entity = new HttpEntity<>(dataToBeSenttoVM, headers); log.info("something"); ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod.POST, entity, String.class);
如果之前使用的是HttpComponentsClientHttpRequestFactory等其他工厂,直接实例化对应类即可,无需额外日志配置。
三、临时调整日志级别(多线程环境不推荐)
若以上方法不适用,可在代码执行前后临时修改RestTemplate的日志级别,执行完成后恢复:
HttpHeaders headers = new HttpHeaders(); RestTemplate restTemplate = new RestTemplate(); headers.setContentType(MediaType.TEXT_PLAIN); HttpEntity<String> entity = new HttpEntity<>(dataToBeSenttoVM, headers); log.info("something"); // 获取RestTemplate对应的Logger Logger restTemplateLogger = LoggerFactory.getLogger(RestTemplate.class); Level originalLevel = restTemplateLogger.getLevel(); // 临时设置为ERROR级别,抑制DEBUG日志 restTemplateLogger.setLevel(Level.ERROR); ResponseEntity<String> response = null; try { response = restTemplate.exchange(url,HttpMethod.POST, entity, String.class); } finally { // 恢复原日志级别 restTemplateLogger.setLevel(originalLevel); }
该方法在多线程环境下可能影响其他线程的RestTemplate日志输出,仅适合单线程或隔离场景使用。
内容的提问来源于stack exchange,提问作者Darth Moul
相关产品推荐
相关产品推荐

