合理配置Nginx access_log需按需记录、分级存储、及时轮转、必要过滤:定制日志格式适配业务场景,条件启用降低写入量,缓冲写入提升性能,logrotate自动化轮转并归档,核心是精准捕获而非全量记录。

合理配置 Nginx 的 access_log,既能满足运维监控、安全审计和业务分析需求,又可避免磁盘耗尽、I/O 压力过大或日志丢失。核心在于:按需记录、分级存储、及时轮转、必要过滤。
按业务场景定制日志格式与字段
默认的 combined 格式包含基础信息(IP、时间、URI、状态码、大小等),但常不够用。建议根据实际需要定义精简或增强格式:
- 对 CDN 回源或 API 网关场景,添加
$http_x_forwarded_for、$upstream_response_time、$request_time,便于排查延迟瓶颈 - 敏感接口(如登录、支付)可单独开启详细日志,记录
$request_body(需配合lua-resty-logger-socket或开启echo_read_request_body,注意隐私合规) - 静态资源(js/css/img)可使用极简格式(仅记录 URI 和状态码),减少日志体积
- 避免在日志中记录高频率变动字段(如
$cookie_sessionid),除非确有追踪需求
分级启用与条件记录(log\_not\_found / log\_if)
不是所有请求都值得记入主访问日志。可通过条件控制降低写入量:
- 用
log_not_found off;关闭 404 文件未找到日志(尤其静态服务大量 404 时) - 用
map+log_if过滤低价值流量:例如忽略健康检查路径(/healthz)、爬虫 UA、或特定 IP 段 - 对错误率突增的 location,可额外开启 debug 级别 access_log,独立输出到临时文件供快速定位
日志写入方式与性能调优
频繁小写入会拖慢 worker 进程,尤其高并发下:
- 优先使用
buffer=64k flush=5s缓冲写入,平衡实时性与性能;缓冲区满或超时即刷盘 - 避免将日志直接写入网络存储或低 IOPS 磁盘;SSD 或专用日志盘更稳妥
- 禁用
access_log off并非最优解——若只需统计 QPS/状态码分布,可用stub_status模块 + Prometheus 抓取,零日志开销 - 不建议开启
access_log ... gzip(Nginx 1.19+ 支持),压缩由日志收集端(如 Filebeat)完成更灵活
自动化轮转与生命周期管理
靠人工清理极易遗漏,应结合系统工具形成闭环:
- 用
logrotate配置按天切割、保留 30 天、自动压缩(compress)、通知(sharedscripts + postrotate nginx -s reopen) - 切割命名建议含日期(
access.log.20240515),避免用dateext导致时区混乱 - 对长期归档需求,可配置
postrotate脚本将旧日志同步至对象存储(如 S3、OSS)并删除本地副本 - 定期校验日志完整性:对比
ls -lt | head -n 5与zcat *.gz | wc -l,确认无丢失或截断
日志不是越多越好,而是刚好够用。从格式设计到落盘策略,每一步都影响可观测性质量与系统稳定性。关键不在“全量记录”,而在“精准捕获”。

















