在特定 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
的默认序列化程序,我可以在其他地方利用我的注释。
我有一个基于 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
的默认序列化程序,我可以在其他地方利用我的注释。