Nginx 日志切割终极指南:logrotate 完全配置手册

发布时间:2026/7/23 1:27:10
Nginx 日志切割终极指南:logrotate 完全配置手册 为什么 logrotate 是业界标准在众多日志管理方案中logrotate 之所以能成为最主流、最推荐的选择主要得益于以下几点稳定可靠logrotate 是 Linux 系统自带的日志轮转工具经过几十年的生产环境考验成熟度极高能自动完成切割、压缩和清理的全流程。无性能损耗与某些基于 Nginx 第三方模块或脚本的方案不同logrotate 在日志轮转时对 Nginx 的请求处理不产生额外计算开销。配置灵活可以精细控制轮转周期、保留份数、是否压缩、权限设置等满足各种运维需求。核心配置详解在主机的 /etc/logrotate.d/ 目录下为 Nginx 日志创建配置文件如 /etc/logrotate.d/nginx。配置生效后系统的 cron 服务会每日自动触发 logrotate 运行实现全程无人值守。/var/log/nginx/*.log {dailyrotate 7compressdelaycompressmissingoknotifemptysharedscriptspostrotateif [ -f /var/run/nginx.pid ]; thenkill -USR1cat /var/run/nginx.pidfiendscript}配置参数速查属性 说明daily 轮转周期可选 hourly、weekly、monthlyrotate 保留归档文件数量超过7个自动删除compress 使用 gzip 压缩归档日志delaycompress 延迟压缩保留最近一个归档文件未压缩方便即时查看missingok 如果日志文件不存在忽略错误继续执行notifempty 如果日志文件为空跳过本次轮转create 640 nginx nginx 轮转后创建新日志文件指定用户权限sharedscripts 无论匹配了多少个日志文件postrotate 脚本只执行一次postrotate 发送USR1信号确保Nginx在服务不中断的前提下将日志内容写入新文件endscript 脚本结束的标记测试配置配置完成后千万别直接等第二天看效果。先用以下命令验证配置是否正确调试模式最安全sudo logrotate -d /etc/logrotate.d/nginx仅模拟运行输出详细的执行计划和调试信息不会真正切割日志也不会执行 postrotate 脚本用于检查配置文件的语法错误、路径是否正确、轮转条件是否满足完全只读可放心多次运行强制执行验证实际效果sudo logrotate -vf /etc/logrotate.d/nginx-vverbose显示详细的执行过程-fforce强制轮转无视配置中的 daily、size 等条件测试提示如果连续执行两次 -f第二次会因为归档文件已存在而报错。如需反复测试请先清理归档文件sudo rm -f /var/log/nginx/.log.执行时间Cron 还是 Anacron配置好logrotate 后自然会出现一个问题“它到底是几点运行的”答案取决于你的系统使用的是 Cron 还是 Anacron。执行以下命令检查 anacron 是否安装which anacron无输出系统使用 Cron执行时间由 /etc/crontab 控制有输出系统使用 Anacron执行时间由 /etc/anacrontab 控制情况一使用 Cron查看 /etc/crontab 中的配置cat /etc/crontab典型的输出如下17 * * * * root cd / run-parts --report /etc/cron.hourly25 6 * * * root test -x /usr/sbin/anacron || ( cd / run-parts --report /etc/cron.daily )47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / run-parts --report /etc/cron.weekly )52 6 1 * * root test -x /usr/sbin/anacron || ( cd / run-parts --report /etc/cron.monthly )其中 /etc/cron.daily 目录存放每日执行任务。以上配置表示每日任务会在 凌晨 6:25 自动运行。情况二使用 Anacron查看 /etc/anacrontab 中的配置cat /etc/anacrontabAnacron 的设计目标是确保任务在机器开机时一定会执行而不是精确到某分某秒。典型的配置中有 START_HOURS_RANGE 参数如 START_HOURS_RANGE3-22表示任务会在凌晨 3 点到晚上 10 点之间的某个随机时间点执行。如何自定义执行时间如果你的日志采集系统需要在固定时间点如凌晨 0:01抓取日志那么精确控制执行时间就很有必要了。标准操作流程第一步停用系统默认任务将系统自带的每日任务移走防止重复执行sudo mv /etc/cron.daily/logrotate /etc/cron.daily/logrotate.disabled第二步创建自定义 Cron 任务使用 root 权限编辑 crontabsudo crontab -e添加以下行例如固定在每天凌晨 0点1分 执行1 0 * * * /usr/sbin/logrotate /etc/logrotate.confAnacron 环境下如何精确控制如果系统使用 Anacron同样适用上述方案。直接绕过 Anacron使用系统 Cron 即可实现精确控制这是业内最标准、最可靠的做法。番外篇/opt 还是 /varnginx的日志路径选择也有一点讲究。/opt存放“程序本体”静态数据如 /opt/nginx、/opt/app。适合将程序、配置、日志打包在一起方便迁移的场景。/var存放“运行时数据”动态数据如 /var/log、/var/lib。这是 Linux 文件系统标准FHS规定的日志存放位置。在严格的生产环境中日志属于可变数据建议存放在 /var/log/nginx这样更符合系统规范也便于统一管理。