nginx中log_format用于定义日志格式,需在http块内声明命名格式(如main),再通过access_log指令启用;常用变量包括$remote_addr、$http_x_forwarded_for、$request_time、$upstream_response_time等,支持精准监控与排障。

在 Nginx 中,通过 log_format 指令可以灵活定义访问日志的输出格式,从而记录请求中的关键字段(如真实 IP、响应时间、上游状态等),这对排查问题、分析流量和安全审计非常有用。
定义自定义日志格式
在 http 块中使用 log_format 声明一个命名格式,例如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time';
这里 main 是格式名称,后续可在 access_log 中引用。注意:每行末尾不能有空格或换行符(Nginx 会报错),建议写成单行或用反斜杠续行(不推荐)。
常用变量说明与实用字段
以下变量在日志中高频使用,需结合实际场景选择:
-
$remote_addr:客户端真实 IP(若前端有代理,需配合set_real_ip_from和real_ip_header使用) -
$http_x_forwarded_for:代理链中原始客户端 IP 列表(逗号分隔),常用于识别真实访客 -
$request_time:整个请求处理耗时(秒,精度为毫秒),从读取首字节开始到发送完响应为止 -
$upstream_response_time:后端服务返回响应所用时间(多个 upstream 时以逗号分隔),可判断是 Nginx 瓶颈还是后端慢 -
$upstream_status:后端返回的状态码,便于快速发现 5xx 或 4xx 上游错误 -
$host:请求头中的 Host 字段(比$server_name更准确,尤其在泛域名或多站点配置下) -
$request_id:Nginx 1.11.0+ 支持,为每个请求生成唯一 ID,可用于全链路追踪
启用并应用自定义日志格式
定义好格式后,需在 http、server 或 location 块中用 access_log 指令启用:
access_log /var/log/nginx/access.log main;
支持同时写入多个日志文件,也可按条件记录(如只记录非 200 请求):
access_log /var/log/nginx/error_requests.log main if=$loggable;
map $status $loggable {
~^[345] 1;
default 0;
}
验证与调试技巧
修改配置后务必执行 nginx -t 测试语法,再 nginx -s reload 生效。查看日志是否符合预期:
- 用
tail -f /var/log/nginx/access.log实时观察新日志条目 - 检查字段值是否合理(如
$upstream_response_time是否为空——说明未配置 proxy_pass) - 若
$http_x_forwarded_for显示为-,确认客户端或上层代理是否真正携带了该头 - 对含中文或特殊字符的 URL,确保日志文件编码为 UTF-8,避免乱码(Linux 终端默认通常支持)











