可通过自定义log_format与access_log条件日志,仅对匹配特定User-Agent的请求记录含$request_time、$upstream_response_time等字段的详细日志;利用map指令映射目标UA为$log_debug标志,再通过access_log ... if=$log_debug写入独立文件,并确保目录权限与logrotate配置。

可以通过自定义 log_format + access_log 条件判断,只对匹配特定 User-Agent 的请求写入额外详细日志,避免全量记录带来的磁盘与性能开销。
定义含扩展字段的日志格式
在 http 块中新增一个带调试字段的格式,比如包含 $request_time、$upstream_response_time、$http_x_forwarded_for、$sent_http_content_type 等关键信息:
log_format debug_ua '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $request_time $upstream_response_time ' '$http_x_forwarded_for $sent_http_content_type $request_length';- 注意:所有变量必须真实存在且在当前上下文中可访问,例如 $upstream_response_time 需搭配 proxy_pass 使用才有效;$sent_http_content_type 在响应头已生成后才可用。
用 map 指令标记目标 UA 请求
利用 Nginx 内置的 map 模块,将符合条件的 User-Agent 映射为一个标志变量(如 $log_debug),便于后续条件判断:
- 在 http 块顶部添加:
map $http_user_agent $log_debug { default 0; "~*curl/7\.+" 1; "~*python-requests" 1; "~*PostmanRuntime" 1; }- 支持正则匹配,区分大小写(~* 表示忽略大小写),多个 UA 可分行列出;值为 1 表示需采样,0 表示跳过。
按条件写入独立采样日志文件
在 server 或 location 块中,使用 access_log 的条件参数,仅当 $log_debug = 1 时写入 debug 日志:
access_log /var/log/nginx/debug_ua.log debug_ua if=$log_debug;- 该行不会影响默认 access.log,仅额外追加匹配请求到指定文件;Nginx 会自动创建文件并按权限写入。
- 确保目录 /var/log/nginx/ 存在且 Nginx 工作用户(如 www-data 或 nginx)有写权限。
验证与维护建议
配置完成后需重载生效,并快速确认行为是否符合预期:
- 执行
nginx -t检查语法,再nginx -s reload应用变更 - 用 curl 发起测试请求:
curl -A "python-requests/2.28.0" http://your-domain/health - 检查 /var/log/nginx/debug_ua.log 是否新增一行,内容含完整调试字段
- 建议配合 logrotate 定期轮转该文件,防止单个采样日志无限增长











