日志管理,是每一位后端开发者和运维工程师都绕不开的必修课。今天,我们就来聊聊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 | 轮转周期,可选 hourly、weekly、monthly |
| 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):强制轮转,无视配置中的daily、size等条件
测试提示:如果连续执行两次 -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 虽然是一个"上了年纪"的工具,但正是这种经过时间验证的稳定性,让它成为了日志管理领域的长青树。掌握它的配置和使用,是每一位后端开发者运维技能树中不可或缺的一环。