在nginx中自定义日志格式需用log_format定义含$status和$body_bytes_sent的格式,再通过access_log启用;$status表示http状态码,$body_bytes_sent仅统计响应体字节数,更适用于流量统计。

在 Nginx 中自定义日志格式输出状态码($status)和传输字节数($bytes_sent 或 $body_bytes_sent),只需修改 log_format 指令并配合 access_log 使用即可。
核心变量说明
$status:客户端收到的 HTTP 状态码,如 200、404、502 等。
$bytes_sent:响应总字节数(含响应头 + 响应体)。
$body_bytes_sent:仅响应体字节数(不含响应头,更常用,避免因 header 大小波动影响统计)。
定义自定义日志格式
在 http 块中添加或修改 log_format,例如:
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';该格式会记录:客户端 IP、用户、时间、请求行、状态码、响应体字节数、来源页、User-Agent。
启用自定义日志格式
在 server 或 location 块中指定使用该格式:
access_log /var/log/nginx/access.log custom;
确保日志路径有写入权限,重载配置生效:
nginx -t && nginx -s reload
常见注意事项
- 状态码始终用
$status,不要用$upstream_status(那是上游服务器返回的状态,仅限反向代理场景) - 统计流量推荐用
$body_bytes_sent,它更准确反映实际传输内容大小 - 若需记录响应头大小,可用
$bytes_sent减去$body_bytes_sent(需在日志中同时输出两者再计算) - 日志中字段间建议用空格或固定分隔符(如
|),便于后续用 awk / log parser 解析











