一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

时间:2026-07-22 17:09:48 编辑:袖梨 来源:一聚教程网

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

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

为什么 logrotate 是业界标准?

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

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

核心配置详解

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

/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脚本结束的标记

测试配置

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

调试模式(最安全)

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

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

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

测试提示:如果连续执行两次 -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.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 中的配置:

cat /etc/anacrontab

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

如何自定义执行时间?

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

标准操作流程

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

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

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

使用 root 权限编辑 crontab:

sudo crontab -e

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

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

热门栏目