You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kong无数据库声明式模式下如何格式化记录JSON响应体?

解决Kong记录JSON响应体乱码/返回null问题

问题分析

你遇到的乱码字符(如\u001f)是因为后端返回的响应是gzip压缩的二进制数据,直接用get_raw_body()拿到的是压缩后的内容;而get_body("application/json")返回null,是因为Kong无法直接解析压缩的响应体,且未正确处理分块响应的情况。

解决方案

修改pre-function插件的配置,加入响应解压逻辑,并在完整接收响应后再解析JSON:

services:
- name: dummy
  url: <url>
  routes:
    - name: dummy-route
      hosts:
        - <host>
      paths:
        - /dummy

plugins:
- name: pre-function
  config:
      access:
        - kong.service.request.enable_buffering()
      body_filter:
        - |
          -- 仅在响应最后一块数据时处理
          if ngx.arg[2] then
            -- 解压响应体(如果是gzip/deflate压缩)
            kong.service.response.decompress()
            -- 自动解析JSON格式的响应体
            local resp_body = kong.service.response.get_body()
            -- 将解析后的Lua table转为字符串存入日志
            if resp_body then
              kong.log.set_serialize_value("response.body", require("cjson").encode(resp_body))
            end
          end
- name: file-log
  config:
      path: /usr/local/kong/logs.txt
      reopen: true

关键说明

  • kong.service.request.enable_buffering():必须在access阶段开启,否则无法读取完整的响应体。
  • ngx.arg[2]:判断当前是否是响应的最后一块数据,避免分块传输时重复处理。
  • kong.service.response.decompress():自动检测并解压gzip/deflate格式的响应,确保后续能正确解析JSON。
  • require("cjson").encode(resp_body):将解析后的Lua table转为JSON字符串,保证日志中是可读的JSON格式。

验证

修改配置后重新加载Kong,发起请求后查看/usr/local/kong/logs.txt,response.body字段应显示可读的JSON内容。

内容的提问来源于stack exchange,提问作者A_A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:17:52