logrotate可通过统一配置实现多日志同时切割,提升运维效率。将Nginx、Tomcat等日志路径列于同一配置块,使用daily、compress、rotate等指令设定策略,配合sharedscripts确保轮转后仅执行一次postrotate脚本(如reload服务),并通过通配符减少重复。测试时用logrotate -d模拟运行,-f强制执行,验证新日志生成及服务写入正常。建议集中管理配置、避免高频轮转、监控执行状态,以保障系统稳定。

在Linux系统中,日志文件随着时间推移会不断增长,过大的日志不仅影响性能,还可能导致磁盘空间耗尽。为了解决这个问题,logrotate 是一个非常实用的工具,能够自动对日志文件进行轮转、压缩、删除和邮件发送等操作。更进一步,我们可以通过配置实现多个日志文件的同时切割,提升运维效率。
理解logrotate的基本工作原理
logrotate通过读取配置文件来决定哪些日志需要处理以及如何处理。它通常由系统定时任务(cron)每天执行一次,检查日志是否满足轮转条件。
核心机制包括:
- 按时间(每日、每周、每月)或大小触发轮转
- 重命名旧日志并创建新日志文件
- 可选压缩历史日志(如使用gzip)
- 保留指定数量的旧日志副本
- 支持脚本钩子(postrotate、prerotate等)用于服务重启或其他操作
配置多日志同时切割的方法
要实现多个日志文件的统一管理与同时切割,关键是合理组织配置文件结构,并利用通配符或共享指令减少重复。
示例:假设你需要同时切割Nginx、Tomcat和自定义应用的日志:
编辑 /etc/logrotate.d/multi-app-logs
/var/log/nginx/*.log /var/log/tomcat/catalina.out /opt/app/logs/app.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 www-data adm
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
如果tomcat使用systemd,则也可reload或restart
endscript
}
关键点说明:
- 多个路径写在同一块中:将不同服务的日志路径列在同一个{}块内,可确保它们被同时处理
- sharedscripts:表示所有日志轮转完成后才执行一次postrotate脚本,避免每个文件都触发一次reload
- 通配符支持:如 /var/log/nginx/*.log 可匹配所有Nginx访问日志和错误日志
- create权限设置:保证新日志文件权限正确,防止服务无法写入
测试与调试技巧
在正式部署前,务必验证配置是否正确:
- 使用命令 logrotate -d /etc/logrotate.conf 模拟运行,查看详细输出(dry-run)
- 添加 -f 参数强制立即执行轮转:logrotate -f /etc/logrotate.d/multi-app-logs
- 检查日志位置是否有新生成的 .1、.2.gz 文件
- 确认服务进程仍正常写入新日志文件(有时需reload才能切换fd)
如果发现服务未写入新日志,常见原因是未正确reload服务。可在postrotate中加入对应命令,例如 kill -USR1 `cat /var/run/nginx.pid` 或使用systemctl reload。
最佳实践建议
- 将同类或多服务日志切割规则集中在一个配置文件中,便于维护
- 避免频繁轮转(如 hourly),除非有明确需求且已配置cron配合
- 启用compress后注意I/O负载,delaycompress有助于缓解高峰压力
- 监控logrotate自身的执行情况,可通过rsyslog记录其运行状态
- 对于不支持信号重载的服务,考虑使用copytruncate(慎用,存在丢失日志风险)
基本上就这些。只要掌握配置结构和关键字含义,用logrotate实现多个日志文件的同时切割并不复杂,但能显著提升系统稳定性和可维护性。










