Log4j 在特定Gson序列化程序的序列化过程中忽略字段
我在SpringBoot1.4.2上构建了一个无状态RESTAPI。我想把所有API调用都记录到elk中。请求和响应数据(标题、参数、负载)也需要记录。我不想以1:1的比例记录它们-我想过滤掉敏感数据等 我制作了一个方面,它正在拦截我的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
@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);