2

我有一个 spring boot 项目并使用logbook库来记录请求和响应。在 REST API 服务之一中,属性数据类型之一是byte[],因此当客户端发送请求时,由于该数据类型,它会在控制台中打印大量日志,这不是我想要的。

我在文档中看到您可以排除某些路径或内容类型,但不能按名称或数据类型。

这里文档如何建议配置:

Logbook logbook = Logbook.builder()
    .condition(exclude(
        requestTo("/health"),
        requestTo("/admin/**"),
        contentType("application/octet-stream"),
        header("X-Secret", newHashSet("1", "true")::contains)))
    .build();
4

2 回答 2

1

tmarwen 的答案很好,但我想您只想忽略特定的属性或数据类型,而不是 HTTP 内容类型。如果这是真的,那么您可以执行以下操作以按名称忽略特定属性:

.bodyFilter(jsonPath("$.YourSpecificPropertyName").delete())

或者

.bodyFilter(jsonPath("$.YourSpecificPropertyName").replace("ReplaceMessage"))

这是文档中的完整示例:

假设您有如下请求:

{
  "id": 1,
  "name": "Alice",
  "password": "s3cr3t",
  "active": true,
  "address": "Anhalter Straße 17 13, 67278 Bockenheim an der Weinstraße",
  "friends": [
    {
      "id": 2,
      "name": "Bob"
    },
    {
      "id": 3,
      "name": "Charlie"
    }
  ],
  "grades": {
    "Math": 1.0,
    "English": 2.2,
    "Science": 1.9,
    "PE": 4.0
  }
}

通过应用这些配置:

Logbook logbook = Logbook.builder()
        .bodyFilter(jsonPath("$.password").delete())
        .bodyFilter(jsonPath("$.active").replace("unknown"))
        .bodyFilter(jsonPath("$.address").replace("X"))
        .bodyFilter(jsonPath("$.name").replace(compile("^(\\w).+"), "$1."))
        .bodyFilter(jsonPath("$.friends.*.name").replace(compile("^(\\w).+"), "$1."))
        .bodyFilter(jsonPath("$.grades.*").replace(1.0))
        .build();

变成 :

{
  "id": 1,
  "name": "Alice",
  "active": "unknown",
  "address": "XXX",
  "friends": [
    {
      "id": 2,
      "name": "B."
    },
    {
      "id": 3,
      "name": "C."
    }
  ],
  "grades": {
    "Math": 1.0,
    "English": 1.0,
    "Science": 1.0,
    "PE": 1.0
  }
}
于 2021-10-17T16:39:32.830 回答
0

您可以在配置实例时使用BodyReplacer(s) as RequestFilter(s) 来混淆您的正文内容。Logbook

二进制数据

对于二进制数据,即当HTTP Content-Type为以下之一时:

  • 应用程序/八位字节流
  • 申请/pdf
  • 声音的/*
  • 图片/*
  • 视频/*

您可以BodyReplacers#binary按如下方式使用替换器:

Logbook logbook = Logbook.builder()
    .requestFilter(RequestFilters.replaceBody(BodyReplacers.binary())) // which will replace body content with `<binary>` string in all incoming HTTP requests
    .responseFilter(ResponseFilters.replaceBody(BodyReplacers.binary())) // does the same when logging HTTP responses
    // other configuration properties
    .build();

多部分数据

HTTP Content-Type的类型为:

  • 多部分/*

您可以BodyReplacers#multipart按如下方式使用替换器:

Logbook logbook = Logbook.builder()
    .requestFilter(RequestFilters.replaceBody(BodyReplacers.multipart())) // which will replace body content with `<multipart>` string in all incoming HTTP requests
    .responseFilter(ResponseFilters.replaceBody(BodyReplacers.multipart())) // does the same when logging HTTP responses
    // other configuration properties
    .build();

流式内容数据

当数据为块流时,即HTTP Content-Type为以下类型之一:

  • 应用程序/json-seq
  • 应用程序/x-json-stream
  • 应用程序/流+json
  • 文本/事件流

您可以BodyReplaces#stream按如下方式使用替换器:

Logbook logbook = Logbook.builder()
    .requestFilter(RequestFilters.replaceBody(BodyReplacers.stream())) // which will replace body content with `<stream>` string in all incoming HTTP requests
    .responseFilter(ResponseFilters.replaceBody(BodyReplacers.stream())) // does the same when logging HTTP responses
    // other configuration properties
    .build();
于 2021-10-17T11:14:09.543 回答