如何在Spring Boot的Logbook中排除请求日志的指定属性或数据类型?
Logbook按属性名/数据类型过滤日志解决方案
核心实现思路
Logbook提供了BodyFilter接口用于修改请求/响应的body内容再输出日志,不需要全局排除整路径请求,仅需自定义过滤规则替换掉敏感/大体积字段即可。
实现步骤
- 自定义
BodyFilter实现类,对对应格式的请求/响应body做解析,匹配到指定属性名或byte[]类型字段时,替换为占位符即可 - 将自定义的BodyFilter注册到Logbook实例中
代码示例
1. 自定义字段过滤BodyFilter
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.zalando.logbook.BodyFilter; import java.io.IOException; import java.util.Set; public class FieldExcludingBodyFilter implements BodyFilter { private final ObjectMapper objectMapper = new ObjectMapper(); // 需要排除的属性名列表 private final Set<String> excludedFieldNames = Set.of("fileContent", "secret", "binaryData"); @Override public String filter(String contentType, String body) { // 只处理JSON类型的body,其他格式可自行扩展判断逻辑 if (contentType == null || !contentType.contains("application/json")) { return body; } try { JsonNode rootNode = objectMapper.readTree(body); processNode(rootNode); return objectMapper.writeValueAsString(rootNode); } catch (IOException e) { // 解析失败直接返回原始内容 return body; } } private void processNode(JsonNode node) { if (node.isObject()) { ObjectNode objectNode = (ObjectNode) node; objectNode.fields().forEachRemaining(entry -> { String fieldName = entry.getKey(); JsonNode fieldValue = entry.getValue(); // 匹配属性名排除 if (excludedFieldNames.contains(fieldName)) { objectNode.put(fieldName, "[FILTERED]"); return; } // 匹配byte[]类型(Jackson会把byte[]解析为binary类型的节点) if (fieldValue.isBinary()) { objectNode.put(fieldName, "[BINARY_DATA_FILTERED]"); return; } // 递归处理嵌套对象 processNode(fieldValue); }); } else if (node.isArray()) { node.forEach(this::processNode); } } }
2. 注册到Logbook实例
Logbook logbook = Logbook.builder() // 原有排除规则保留 .condition(exclude( requestTo("/health"), requestTo("/admin/**"), contentType("application/octet-stream"), header("X-Secret", newHashSet("1", "true")::contains))) // 添加自定义的body过滤器 .bodyFilter(new FieldExcludingBodyFilter()) .build();
Spring Boot项目自动配置
如果是Spring Boot集成Logbook,直接把自定义BodyFilter注册为Bean即可,框架会自动装配到Logbook实例中:
@Bean public BodyFilter fieldExcludingBodyFilter() { return new FieldExcludingBodyFilter(); }
补充说明
如果你的请求是表单提交或其他非JSON格式,可以对应修改BodyFilter中的解析逻辑,匹配对应格式的字段规则即可。
内容的提问来源于stack exchange,提问作者Nima MashhadiZadeh
相关产品推荐
相关产品推荐

