nginx可通过内置变量直接记录请求头和响应头:请求头用$http_前缀(自动转小写+下划线),响应头用$sent_http_前缀(仅完整响应后可用);缺失时可配合map指令设置fallback,如$trace_id兜底x-request-id。

可以直接用内置变量记录请求头和响应头,不需要额外模块或重启,但要注意命名规则和生效条件。
记录任意请求头(如 X-Request-ID、Authorization)
Nginx 会把请求头自动转为小写、用下划线替代连字符,并加上 $http_ 前缀。例如:
- X-Request-ID → 变量是 $http_x_request_id
- Authorization → 变量是 $http_authorization
- Content-Type → 变量是 $http_content_type
在 log_format 中直接引用即可:
log_format custom '$remote_addr [$time_local] "$request" $status "$http_x_request_id" "$http_authorization"';记录后端返回的响应头(如 X-Biz-Trace-ID、Set-Cookie)
响应头需用 $sent_http_ 前缀,且仅在 Nginx 完整收到后端响应后才可用:
- X-Biz-Trace-ID → $sent_http_x_biz_trace_id
- Set-Cookie → $sent_http_set_cookie
- Content-Type → $sent_http_content_type
注意:若后端未返回该头、或请求失败(如 502/超时),对应变量值为空,日志中显示为“-”。
让缺失的头有 fallback,避免日志断层
用 map 指令定义带兜底逻辑的变量,提升日志稳定性:
map $sent_http_x_biz_trace_id $trace_id {"" $sent_http_x_request_id;
default $sent_http_x_biz_trace_id;
}
然后在日志格式中使用 $trace_id。这样当 X-Biz-Trace-ID 缺失时,自动降级到 X-Request-ID。
常见问题排查要点
- 确认后端确实返回了目标响应头(用 curl -I 验证)
- 检查是否启用了 underscores_in_headers on(它只影响接收请求头,不影响 $sent_http_*)
- 若用 proxy_pass,确保不是因 upstream 错误导致响应未发出(此时 $sent_http_* 不可用,可改用 $upstream_http_* 作补充)
- 变量名必须全小写+下划线,大小写或连字符会匹配失败











