Nginx的access_log不直接统计分析,但通过记录$statusCode为后续分析提供基础;需确保日志格式包含$status,可用awk快速统计状态码分布,或接入ELK、Prometheus等系统实现可视化监控与告警。
在 Nginx 中,access_log 本身不直接提供“统计分析”功能,但它能以结构化格式记录每次请求的响应状态码($status),这是后续做返回码分布、异常率、趋势监控等分析的基础。关键在于:日志格式要包含状态码,日志内容要便于提取和聚合。
Nginx 默认日志格式通常已含 $status,但建议显式确认或自定义更清晰的格式,尤其当需要配合日志分析工具时:
示例(在 http 或 server 块中定义):
log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$request_time $upstream_response_time';
然后启用:
access_log /var/log/nginx/access.log main;
这样每行日志都会明确记录 HTTP 状态码(如 200、404、502),为后续分析提供原始依据。
对已有 access.log 文件,可借助 shell 工具快速查看状态码频次:
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -n
awk '$9 ~ /^4|5/ {print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
tail -1000 /var/log/nginx/access.log | awk '$9 == "500" {count++} END {print count+0}'
这些命令适合临时排查或写入监控脚本,响应快、无需额外依赖。
生产环境推荐将 access_log 接入专业工具,实现可视化与告警:
高频接口全量记录可能带来磁盘 I/O 和存储压力,必要时可条件记录:
access_log /var/log/nginx/error_access.log main if=$loggable;
配合:map $status $loggable { ~^[45] 1; default 0; }
使用 limit_req 配合日志条件,或用 logrotate 定期切分+压缩。
避免因日志过度影响 Nginx 吞吐,尤其在高并发场景下。