49人参与 • 2026-07-22 • Php
日志管理,是每一位后端开发者和运维工程师都绕不开的必修课。今天,我们就来聊聊nginx 日志管理的最佳实践——logrotate。
在众多日志管理方案中,logrotate 之所以能成为最主流、最推荐的选择,主要得益于以下几点:
在主机的 /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 | 轮转周期,可选 hourly、weekly、monthly |
| 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):强制轮转,无视配置中的 daily、size 等条件测试提示:如果连续执行两次 -f,第二次会因为归档文件已存在而报错。如需反复测试,请先清理归档文件:
sudo rm -f /var/log/nginx/*.log.*
配置好logrotate 后自然会出现一个问题:“它到底是几点运行的?”答案取决于你的系统使用的是 cron 还是 anacron。
执行以下命令,检查 anacron 是否安装:
which anacron
/etc/crontab 控制/etc/anacrontab 控制查看 /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 自动运行。
查看 /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,使用系统 cron 即可实现精确控制,这是业内最标准、最可靠的做法。
nginx的日志路径选择也有一点讲究。
/opt:存放“程序本体”(静态数据),如 /opt/nginx、/opt/app。适合将程序、配置、日志打包在一起方便迁移的场景。/var:存放“运行时数据”(动态数据),如 /var/log、/var/lib。这是 linux 文件系统标准(fhs)规定的日志存放位置。在严格的生产环境中,日志属于可变数据,建议存放在 /var/log/nginx,这样更符合系统规范,也便于统一管理。
logrotate 虽然是一个“上了年纪”的工具,但正是这种经过时间验证的稳定性,让它成为了日志管理领域的长青树。掌握它的配置和使用,是每一位后端开发者运维技能树中不可或缺的一环。
到此这篇关于nginx日志切割终极指南之logrotate完全配置手册的文章就介绍到这了,更多相关nginx日志切割内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论