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
相关产品推荐
相关产品推荐

