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

Log4j 在特定Gson序列化程序的序列化过程中忽略字段,log4j,gson,logstash,slf4j,log4j2,Log4j,Gson,Logstash,Slf4j,Log4j2,我在SpringBoot1.4.2上构建了一个无状态RESTAPI。我想把所有API调用都记录到elk中。请求和响应数据(标题、参数、负载)也需要记录。我不想以1:1的比例记录它们-我想过滤掉敏感数据等 我制作了一个方面,它正在拦截我的@RestController的方法调用。在下面的文章中,我为应该记录的方法参数创建了自定义注释(我在由@RequestBody注释的有效负载上使用它),它使我能够访问我的@Around建议中的数据传输对象。我不在乎它们的类型-我想调用logger.debug(l

我在SpringBoot1.4.2上构建了一个无状态RESTAPI。我想把所有API调用都记录到elk中。请求和响应数据(标题、参数、负载)也需要记录。我不想以1:1的比例记录它们-我想过滤掉敏感数据等

我制作了一个方面,它正在拦截我的
@RestController
的方法调用。在下面的文章中,我为应该记录的方法参数创建了自定义注释(我在由
@RequestBody
注释的有效负载上使用它),它使我能够访问我的
@Around
建议中的数据传输对象。我不在乎它们的类型-我想调用
logger.debug(logObject)
并将此日志发送到logstash

据我所知,日志消息应该作为JSON发送,并在Log4j2 appender中设置JSONLayout,以简化日志存储方面的工作。因此,我将我的
logObject
序列化为JSON日志消息,但在此期间,我只想过滤掉敏感数据。我不能使用
瞬态
,因为我的控制器依赖于同一字段


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

我不敢相信我在文档中遗漏了这一点。是链接吗

我的自定义批注:

@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;
    }
}
通过这种方式,Spring在内部使用默认序列化程序,它不知道
@IgnoreForLogging
,我可以在其他地方利用我的注释

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