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

日志管理,是每一位后端开发者和运维工程师都绕不开的必修课。今天,我们就来聊聊Nginx 日志管理的最佳实践------logrotate。

为什么 logrotate 是业界标准?

在众多日志管理方案中,logrotate 之所以能成为最主流、最推荐的选择,主要得益于以下几点:

  • 稳定可靠:logrotate 是 Linux 系统自带的日志轮转工具,经过几十年的生产环境考验,成熟度极高,能自动完成切割、压缩和清理的全流程。
  • 无性能损耗:与某些基于 Nginx 第三方模块或脚本的方案不同,logrotate 在日志轮转时对 Nginx 的请求处理不产生额外计算开销。
  • 配置灵活:可以精细控制轮转周期、保留份数、是否压缩、权限设置等,满足各种运维需求。

核心配置详解

在主机的 /etc/logrotate.d/ 目录下为 Nginx 日志创建配置文件(如 /etc/logrotate.d/nginx)。配置生效后,系统的 cron 服务会每日自动触发 logrotate 运行,实现全程无人值守。

bash 复制代码
/var/log/nginx/*.log {
    daily      
    rotate 7   
    compress
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
	        kill -USR1 `cat /var/run/nginx.pid`
	    fi
    endscript
}

配置参数速查

属性 说明
daily 轮转周期,可选 hourlyweeklymonthly
rotate 保留归档文件数量,超过7个自动删除
compress 使用 gzip 压缩归档日志
delaycompress 延迟压缩,保留最近一个归档文件未压缩,方便即时查看
missingok 如果日志文件不存在,忽略错误继续执行
notifempty 如果日志文件为空,跳过本次轮转
create 640 nginx nginx 轮转后创建新日志文件,指定用户权限
sharedscripts 无论匹配了多少个日志文件,postrotate 脚本只执行一次
postrotate 发送USR1信号,确保Nginx在服务不中断的前提下,将日志内容写入新文件
endscript 脚本结束的标记

测试配置

配置完成后,千万别直接等第二天看效果。先用以下命令验证配置是否正确:

调试模式(最安全)

bash 复制代码
sudo logrotate -d /etc/logrotate.d/nginx
  • 仅模拟运行,输出详细的执行计划和调试信息
  • 不会真正切割日志,也不会执行 postrotate 脚本
  • 用于检查配置文件的语法错误、路径是否正确、轮转条件是否满足
  • 完全只读,可放心多次运行

强制执行(验证实际效果)

bash 复制代码
sudo logrotate -vf /etc/logrotate.d/nginx
  • -v(verbose):显示详细的执行过程
  • -f(force):强制轮转,无视配置中的 dailysize 等条件

测试提示:如果连续执行两次 -f,第二次会因为归档文件已存在而报错。如需反复测试,请先清理归档文件:

bash 复制代码
sudo rm -f /var/log/nginx/*.log.*

执行时间:Cron 还是 Anacron?

配置好logrotate 后自然会出现一个问题:"它到底是几点运行的?"答案取决于你的系统使用的是 Cron 还是 Anacron。

执行以下命令,检查 anacron 是否安装:

bash 复制代码
which anacron
  • 无输出:系统使用 Cron,执行时间由 /etc/crontab 控制
  • 有输出:系统使用 Anacron,执行时间由 /etc/anacrontab 控制

情况一:使用 Cron

查看 /etc/crontab 中的配置:

bash 复制代码
cat /etc/crontab

典型的输出如下:

bash 复制代码
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 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 中的配置:

bash 复制代码
cat /etc/anacrontab

Anacron 的设计目标是确保任务在机器开机时一定会执行,而不是精确到某分某秒。典型的配置中有 START_HOURS_RANGE 参数(如 START_HOURS_RANGE=3-22),表示任务会在凌晨 3 点到晚上 10 点之间的某个随机时间点执行。

如何自定义执行时间?

如果你的日志采集系统需要在固定时间点(如凌晨 0:01)抓取日志,那么精确控制执行时间就很有必要了。

标准操作流程

第一步:停用系统默认任务

bash 复制代码
# 将系统自带的每日任务移走,防止重复执行
sudo mv /etc/cron.daily/logrotate /etc/cron.daily/logrotate.disabled

第二步:创建自定义 Cron 任务

使用 root 权限编辑 crontab:

bash 复制代码
sudo crontab -e

添加以下行(例如固定在每天凌晨 0点1分 执行):

bash 复制代码
1 0 * * * /usr/sbin/logrotate /etc/logrotate.conf

Anacron 环境下如何精确控制?

如果系统使用 Anacron,同样适用上述方案。直接绕过 Anacron,使用系统 Cron 即可实现精确控制,这是业内最标准、最可靠的做法。

番外篇:/opt 还是 /var?

nginx的日志路径选择也有一点讲究。

  • /opt :存放"程序本体"(静态数据),如 /opt/nginx/opt/app。适合将程序、配置、日志打包在一起方便迁移的场景。
  • /var :存放"运行时数据"(动态数据),如 /var/log/var/lib。这是 Linux 文件系统标准(FHS)规定的日志存放位置。

在严格的生产环境中,日志属于可变数据,建议存放在 /var/log/nginx,这样更符合系统规范,也便于统一管理。

结语

logrotate 虽然是一个"上了年纪"的工具,但正是这种经过时间验证的稳定性,让它成为了日志管理领域的长青树。掌握它的配置和使用,是每一位后端开发者运维技能树中不可或缺的一环。