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

如何在Kong访问日志中获取请求与响应体并配置UDP日志插件至Graylog?

解决Kong API管理器请求/响应体日志到Graylog的完整步骤

我来帮你梳理后续的关键操作,确保能在Graylog仪表板中成功拿到完整的请求和响应体日志:

1. 补全Nginx变量的捕获配置

你已经修改了log-serializers/basic.lua,但默认情况下Nginx不会自动捕获请求体和响应体,需要在/usr/local/kong/nginx-kong.conf里添加以下配置:

# 放在http块内部
lua_need_request_body on;
set $resp_body "";

body_filter_by_lua_block {
    # 截断响应体到10000字符,避免日志过大,可根据需求调整
    local resp_body_chunk = string.sub(ngx.arg[1], 1, 10000)
    ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body_chunk
    # 当响应结束时(ngx.arg[2]为true),把完整响应体赋值给变量
    if ngx.arg[2] then
        ngx.var.resp_body = ngx.ctx.buffered
    end
}
  • lua_need_request_body on:强制Nginx读取请求体,否则ngx.var.req_body会为空
  • body_filter_by_lua_block:逐块捕获响应体,最后拼接成完整内容赋值给$resp_body变量

2. 修正log-serializer的变量定义

你之前的代码里把响应体变量写成了test,需要改成正确的字段名,修改log-serializers/basic.lua里的response结构:

response = {
    status = ngx.status,
    headers = ngx.resp.get_headers(),
    size = ngx.var.bytes_sent,
    req_body = ngx.var.req_body,
    resp_body = ngx.var.resp_body, -- 这里修正变量名
}

3. 重启Kong服务使配置生效

修改完Nginx和Lua文件后,必须重启Kong才能加载新配置:

kong restart

4. 确认UDP-Log插件的配置正确性

确保你给目标服务/路由启用插件时,指定了Graylog的UDP地址和端口:

# 示例:给某个路由添加udp-log插件
kong route plugin add udp-log <你的路由ID> --config host=graylog服务器IP port=12201

同时要在Graylog后台创建UDP输入,端口和上面配置的一致,并且输入格式选择GELF UDP(Kong的udp-log插件默认发送GELF格式日志)。

5. 测试与调试

  • 发送测试请求到Kong代理的API,比如:
    curl -X POST http://kong-IP:8000/你的API路径 -d "username=test&password=123"
    
  • 查看Graylog的对应流,检查日志中是否包含req_body和resp_body字段
  • 如果日志没出现,先排查Kong的错误日志:
    tail -f /usr/local/kong/logs/error.log
    
  • 也可以用tcpdump抓包,确认Kong是否向Graylog发送UDP日志:
    tcpdump -i any udp port 12201
    

6. 生产环境注意事项

  • 捕获请求/响应体会增加Kong的内存占用,建议对大请求体设置合理的截断长度
  • 不要全局启用该日志,只在需要调试的路由/服务上开启
  • Graylog要配置合适的索引生命周期策略,避免日志量过大导致存储压力

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:31