nginx中log_format用于自定义访问日志格式,支持组合$remote_addr、$time_local、$request、$status等内置变量;示例格式包含客户端ip、时间、请求行、状态码、耗时、上游响应时间、ua、referer、host、request_id及x-forwarded-for。

在 Nginx 中,log_format 指令用于定义访问日志的输出格式,你可以通过组合内置变量来自定义任意字段,包括客户端信息、请求细节、响应状态、耗时、上游服务等。关键在于熟悉常用变量,并按需组合。
常用且实用的自定义字段变量
以下是一些高频使用、信息量大的变量,可直接嵌入 log_format:
-
$remote_addr:真实客户端 IP(注意:若前端有代理,需配合$http_x_forwarded_for或$realip_remote_addr) -
$time_local:本地时间,格式如10/Jan/2024:14:32:15 +0800 -
$request:完整请求行,例如GET /api/v1/users?id=123 HTTP/1.1 -
$status:HTTP 响应状态码(如 200、404、502) -
$body_bytes_sent:响应体字节数(不包含响应头) -
$request_time:请求处理总耗时(秒,精度为毫秒,如0.023) -
$upstream_response_time:上游服务器返回响应的时间(多个 upstream 用逗号分隔,如0.012, 0.009) -
$http_user_agent:客户端 UA 字符串(建议用$http_user_agent而非$user_agent) -
$http_referer:来源页面(注意拼写是referer,不是referrer) -
$request_id:Nginx 生成的唯一请求 ID(需启用ngx_http_core_module,1.11.0+ 默认支持)
一个生产级详细日志格式示例
下面是一个兼顾可读性、调试性和结构化分析(如接入 ELK)的日志格式定义:
说明:
- 用空格和引号清晰分隔字段,便于后续用空格或正则解析
-
$http_x_forwarded_for放最后,方便在有代理时快速提取原始 IP(取第一个非私有地址) -
$request_id是链路追踪关键,建议始终开启并记录 - 若需兼容 JSON 日志,可用
log_format配合第三方模块(如nginx-json-log),但原生 Nginx 不支持直接输出 JSON
注意事项与进阶技巧
自定义字段时容易忽略的关键点:
- 变量值为空时默认输出“-”,如未带
Referer头,则$http_referer显示为-;如需统一为空字符串,可用map指令预处理 -
$upstream_response_time在请求未转发到 upstream(如 4xx 错误、rewrite、静态文件)时为空,日志中显示为“-” - 如需记录请求体(如 POST 参数),Nginx 默认不支持;可通过
$request_body变量(需搭配lua-resty-core或 OpenResty)或改用 access log buffer + Lua 拦截实现,但存在性能与安全风险,不推荐常规使用 - 定义好
log_format后,必须在access_log指令中引用名称,例如:access_log /var/log/nginx/access.log detailed;











