You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:54:03