Nginx打印RequestBody
背景
新的日志收集构架中直接去掉 SpringBoot 服务,而是通过 Nginx 作为服务器,收集日志,打印成日志文件,通过 Flume 消费到 Kafka 中。由于日志收集的请求都是 Post JSON 的格式,所以需要在 Nginx 中获取 Post 的 Body。
问题
在配置 log_format 后,发现无法打印 $request_body
1 | log_format user_log_format escape=json '{"time": "$msec", "ip": "$remote_addr", "ua": "$http_user_agent", "data": "$request_body"}'; |
查看官方文档,有如下注释。意思是说 $request_body 需要在带有 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass 这些指令的 location 中,当 request_body 被读到内存缓冲区中使用。
1 | The variable’s value is made available in locations processed by the proxy_pass, fastcgi_pass, uwsgi_pass, and scgi_pass directives when the request body was read to a memory buffer. |
Nginx 安装
由于在解决问题的时候需要使用到 ngx_lua 模块,所以我是直接安装的 OpenResty。
官网:http://openresty.org/cn/
安装文档:http://openresty.org/cn/installation.html
解决
在使用 (proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass) 指令的 location 中打印日志。
使用 HTTP Echo Module (OpenResty 中已经包括了这个模块)。
HTTP Echo Module 参考文档:https://www.nginx.com/resources/wiki/modules/echo/
1 | worker_processes 1; |
使用 ngx_lua 模块
Lua 参考文档:https://www.nginx.com/resources/wiki/modules/lua/
1 | worker_processes 1; |
还可以通过自定义的变量存放 request_body,然后再 log_format 中使用自定义变量打印。
1 | worker_processes 1; |