当前位置: 代码网 > it编程>编程语言>Php > Nginx日志切割终极指南之logrotate完全配置手册

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

2026年07月22日 Php 我要评论
日志管理,是每一位后端开发者和运维工程师都绕不开的必修课。今天,我们就来聊聊nginx 日志管理的最佳实践——logrotate。为什么 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 虽然是一个“上了年纪”的工具,但正是这种经过时间验证的稳定性,让它成为了日志管理领域的长青树。掌握它的配置和使用,是每一位后端开发者运维技能树中不可或缺的一环。

到此这篇关于nginx日志切割终极指南之logrotate完全配置手册的文章就介绍到这了,更多相关nginx日志切割内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com