如何在Nginx 1.19版本的日志中打印请求体?
Nginx 1.19 打印请求体到日志的解决方案
你当前的配置仅将请求体写入临时文件,并未把请求体内容输出到日志中,需要配合日志格式定义和必要变量实现需求,具体步骤如下:
1. 定义包含请求体的日志格式
在nginx.conf的http块中,新增或修改日志格式,加入$request_body变量捕获请求体内容:
http { # 自定义包含请求体的日志格式 log_format access_with_body '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$request_body"'; # 其他全局配置... }
2. 在代理location块启用该日志格式
在Tomcat代理的location块中,指定使用上述日志格式,同时调整client_body_in_file_only参数避免残留临时文件:
location /your-proxy-path { # 保留原有缓冲配置 client_body_buffer_size 10k; client_max_body_size 1m; # 请求处理完成后自动删除临时文件 client_body_in_file_only clean; # 启用包含请求体的日志 access_log /var/log/nginx/access.log access_with_body; # Tomcat代理配置 proxy_pass http://your-tomcat-upstream; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 其他代理相关配置... }
3. 处理超过缓冲大小的请求体
若请求体大小超过client_body_buffer_size(10k),Nginx会将请求体写入临时文件,此时$request_body变量为空,需借助ngx_lua模块读取临时文件内容:
3.1 确保Nginx已安装ngx_lua模块
- 编译安装:编译时添加
--add-module=path/to/ngx_lua参数 - 包管理安装:Debian/Ubuntu可安装
libnginx-mod-http-lua包
3.2 在location块添加Lua代码读取临时文件
location /your-proxy-path { client_body_buffer_size 10k; client_max_body_size 1m; client_body_in_file_only clean; access_log /var/log/nginx/access.log access_with_body; # 读取临时文件内容到$request_body变量 rewrite_by_lua_block { if ngx.var.request_body_file then local file_handle = io.open(ngx.var.request_body_file, "r") if file_handle then local body_content = file_handle:read("*a") file_handle:close() ngx.var.request_body = body_content end end } # Tomcat代理配置... proxy_pass http://your-tomcat-upstream; }
4. 验证配置并重启Nginx
- 检查配置语法:执行
nginx -t确保无错误 - 重启生效:执行
nginx -s reload
注意事项
- 大请求体打印会导致日志体积快速膨胀,建议配合
logrotate等工具管理日志 - 二进制请求体在日志中会显示乱码,可按需过滤这类请求
- 确保Nginx对
client_body_temp_path(默认是Nginx安装目录下的temp文件夹)有读写权限
内容的提问来源于stack exchange,提问作者AnandArc
相关产品推荐
相关产品推荐

