Nginx 访问日志的每一列分别是什么意思?
Nginx 访问日志默认 combined 格式的各列含义:remote_addr、remote_user、time_local、request、status、body_bytes_sent、http_referer、http_user_agent。本文逐列详解并介绍自定义 log_format。
默认 combined 格式的各列依次为:客户端 IP、认证用户、本地时间、请求行、状态码、响应字节数、Referer 来源、User-Agent。
默认格式与逐列解析
nginx.conf 中的定义:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
一条日志示例:
192.168.1.1 - - [15/Jan/2024:10:30:45 +0800] "GET /api/users HTTP/1.1" 200 1234 "https://example.com/page" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
| 列 | 变量 | 含义 |
|---|---|---|
192.168.1.1 |
$remote_addr |
客户端 IP |
- |
$remote_user |
HTTP 认证用户名(无认证时为 -) |
[15/Jan/2024:10:30:45 +0800] |
$time_local |
本地时间(含时区) |
"GET /api/users HTTP/1.1" |
$request |
请求行:方法 + 路径 + 协议 |
200 |
$status |
响应状态码 |
1234 |
$body_bytes_sent |
响应体字节数(不含响应头) |
"https://..." |
$http_referer |
来源页面 |
"Mozilla/5.0..." |
$http_user_agent |
客户端 UA |
常用扩展变量
log_format performance '$remote_addr [$time_local] "$request" '
'$status $body_bytes_sent '
'$request_time $upstream_response_time'; # 耗时字段
$request_time:完整请求处理时间(秒,毫秒精度);$upstream_response_time:后端服务响应时间;$http_x_forwarded_for:代理链中的真实 IP;$request_length:请求大小(含请求体和头)。
观测云对照
观测云 Nginx 集成自动采集并解析访问日志所有字段(含 request_time 等性能字段),控制台直接查看 QPS、延迟分布、状态码趋势、TOP URL,并支持 5xx 告警配置。
常见问题(FAQ)
Q:$remote_addr 显示的是代理 IP 怎么办?
A:配置了反向代理后,Nginx 看到的是代理的 IP。配置 set_real_ip_from + real_ip_header X-Forwarded-For 还原真实客户端 IP。
Q:$time_local 能改成 ISO 格式吗?
A:用 $time_iso8601(如 2024-01-15T10:30:45+08:00),机器解析更友好;$msec 是带毫秒的时间戳。
Q:某些请求没有记日志?
A:检查 location 中是否有 access_log off(健康检查等端点常关日志)。