【问题标题】:How to exclude a specific property or data type from log request in logbook?如何从日志中的日志请求中排除特定属性或数据类型?
【发布时间】:2021-12-04 18:00:25
【问题描述】:

我有一个 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();

【问题讨论】:

    标签: java spring-boot logging logbook


    【解决方案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
      }
    }
    

    【讨论】:

      【解决方案2】:

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

      二进制数据

      对于二进制数据,即当 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();
      

      【讨论】:

        猜你喜欢
        • 2022-07-08
        • 1970-01-01
        • 2019-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        相关资源
        最近更新 更多