悠悠楠杉
Linux日志使用logrotate按目录批量切割的配置说明
在日常的Linux系统维护中,日志文件是排查问题、监控服务运行状态的重要依据。但随着服务持续运行,日志文件不断增长,不仅占用大量磁盘空间,还会影响系统性能和日志检索效率。因此,合理地对日志进行切割与归档,成为系统管理员必须掌握的核心技能之一。
Linux系统中,logrotate 是最常用且功能强大的日志轮转工具。它能够自动按时间或大小对日志文件进行切割、压缩、归档,并支持删除过期日志,极大减轻了人工干预的负担。虽然大多数教程只介绍单个日志文件的配置方式,但在实际生产环境中,我们更常遇到的是需要对某一目录下的多个日志文件进行统一管理的需求——比如Nginx、Tomcat、自定义应用日志分散在 /var/log/app/ 目录下,如何一次性完成这些日志的批量切割?
答案就在于 logrotate 的通配符支持和目录级配置能力。
首先,确保系统已安装 logrotate。大多数主流发行版默认已包含该工具,可通过以下命令确认:
bash
which logrotate
若未安装,可使用包管理器进行安装,例如在CentOS中执行:
bash
yum install -y logrotate crontabs
接下来,进入核心配置环节。logrotate 的主配置文件通常位于 /etc/logrotate.conf,而具体服务的配置则放在 /etc/logrotate.d/ 目录下。为了实现按目录批量切割,我们建议在 /etc/logrotate.d/ 下创建一个自定义配置文件,例如命名为 app-logs。
假设我们的应用日志统一存放在 /var/log/app/ 目录下,所有日志文件以 .log 结尾,我们希望实现以下目标:
- 每天切割一次日志;
- 保留最近7天的日志备份;
- 切割后自动压缩;
- 切割完成后向对应服务发送
SIGUSR1信号以通知其重新打开日志文件; - 如果日志文件为空,则不进行切割。
对应的配置如下:
bash
/var/log/app/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
sharedscripts
postrotate
/bin/killall -USR1 nginx 2>/dev/null || true
endscript
}
这段配置的含义非常清晰:通过 /var/log/app/*.log 匹配该目录下所有 .log 文件,实现批量处理。daily 表示每日轮转一次;rotate 7 保留7个历史版本;compress 启用gzip压缩以节省空间;delaycompress 延迟压缩上一次的归档文件,避免影响当前写入;notifempty 确保空文件不被轮转;create 在切割后创建新的日志文件并设置权限;而 postrotate 和 endscript 之间的脚本则用于通知服务重新加载日志句柄。
这里特别强调 sharedscripts 的作用:它确保 postrotate 脚本在整个日志组处理完毕后仅执行一次,而不是每个匹配文件都执行一次,避免重复发送信号导致服务异常。
此外,为了验证配置是否正确,可以使用 logrotate 的调试模式进行测试:
bash
logrotate -d /etc/logrotate.d/app-logs
该命令会模拟执行并输出详细过程,但不会真正修改任何文件。确认无误后,可手动强制执行一次:
bash
logrotate -f /etc/logrotate.d/app-logs
正常情况下,你会在原日志文件所在目录看到类似 app.log.1.gz 的压缩归档文件,原始日志则被清空并继续写入。
最后,logrotate 默认由系统的cron任务每天自动调用,通常位于 /etc/cron.daily/logrotate,无需额外配置即可实现自动化运行。
通过上述方法,我们不仅实现了对单一服务日志的管理,更构建了一套可扩展、易维护的批量日志切割机制。无论是Web服务器、Java应用还是自研脚本产生的日志,只要遵循统一的存储规范,均可纳入同一套 logrotate 配置中集中管理,显著提升运维效率与系统稳定性。
