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

