nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx日志切割

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

作者:暮色之狐

日志管理,是每一位后端开发者和运维工程师都绕不开的必修课,本文我们将深入解析logrotate这一业界标准的日志轮转工具,从核心配置参数到测试验证,手把手教你实现日志自动切割、压缩和清理,让你的日志管理高效又省心

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

为什么 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

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

sudo logrotate -vf /etc/logrotate.d/nginx

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

sudo rm -f /var/log/nginx/*.log.*

执行时间:Cron 还是 Anacron?

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

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

which anacron

情况一:使用 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的日志路径选择也有一点讲究。

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

结语

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

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

您可能感兴趣的文章:
阅读全文