在特定 Gson 序列化程序的序列化过程中省略字段

Omitting fields during serialization for specific Gson serializer

我有一个基于 Spring Boot 1.4.2 的无状态 REST API。我想将所有 API 调用记录到 elk 中。还需要记录请求和响应数据(headers、参数、负载)。我不想记录它们 1:1 - 我想过滤掉敏感数据等

我创建了一个拦截我的 @RestController 方法调用的方面。我在 this 文章之后为应该记录的方法参数创建了自定义注释(我在 @RequestBody 注释的有效载荷上使用它),它让我可以访问我的数据传输 objects @Around 建议。我不关心它们的类型 - 我想调用 logger.debug(logObject) 并将此日志发送到 logstash。

据我所知,日志消息应该作为 JSON 发送,并在 Log4j2 appender 中设置 JSONLayout 以简化 logstash 端的操作。因此,我将我的 logObject 序列化为 JSON 日志消息,但在这个和这个唯一的序列化过程中,我想过滤掉敏感数据。我不能使用 transient 因为我的控制器依赖于同一个字段。

我能否以某种方式创建一个 @IgnoreForLogging 注释,它只会被我在日志记录建议中使用的自定义 Gson 序列化程序检测到,并且会在标准 Spring 的基础结构中被忽略?我登录 logstash 的方法是否正确(我是第一次尝试设置它)?

我不敢相信我在文档中遗漏了这一点。 Here 是 link

我的自定义注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface IgnoreForLogging {
}

序列化对象的策略:

public class LoggingExclusionStrategy implements ExclusionStrategy {
    @Override
    public boolean shouldSkipField(FieldAttributes fieldAttributes) {
        return fieldAttributes.getAnnotation(IgnoreForLogging.class) != null;
    }

    @Override
    public boolean shouldSkipClass(Class<?> aClass) {
        return false;
    }
}

在 class 方面序列化日志消息:

Gson gson = new GsonBuilder()
            .setExclusionStrategies(new LoggingExclusionStrategy())
            .create();
String json = gson.toJson(logObject);

这样 Spring 在内部使用不知道 @IgnoreForLogging 的默认序列化程序,我可以在其他地方利用我的注释。