通过cron每小时执行logrotate实现按小时切割日志,需配置独立的logrotate规则文件并设置hourly、dateext及dateformat %Y%m%d%H,结合crontab定时任务和状态文件隔离,确保日志轮转不冲突且文件名含小时时间戳,便于追溯。

Linux系统默认的logrotate工具通常按天、周或月切割日志,但某些场景下需要更细粒度的控制,比如按小时切割。虽然logrotate本身不直接支持“每小时”轮转,但结合系统定时任务(cron)可以轻松实现。以下是完整的进阶配置方法。
启用每小时logrotate执行
logrotate的核心机制依赖于cron调度。要实现按小时切割,需确保logrotate每小时运行一次。
编辑系统crontab:
# crontab -e
添加以下行:
0 * * * * /usr/sbin/logrotate /etc/logrotate.d/myapp-hourly --state=/var/lib/logrotate/myapp-status --verbose
说明:
- 使用独立的配置文件/etc/logrotate.d/myapp-hourly避免与其他策略冲突
- --state指定状态文件路径,防止多个logrotate实例竞争
- --verbose便于调试,生产环境可去掉
编写按小时切割的logrotate配置
创建配置文件:
# vim /etc/logrotate.d/myapp-hourly
内容示例:
/var/log/myapp/app.log {
hourly
missingok
rotate 24
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
/bin/kill -USR1 `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
endscript
}
关键参数解释:
- hourly:声明此规则为每小时触发(需配合每小时cron)
- rotate 24:保留最近24个切片,即一天的历史日志
- delaycompress:延迟压缩上一轮日志,避免频繁压缩开销
- sharedscripts:脚本只在所有日志处理完后运行一次
日志文件命名与时间戳
默认情况下,logrotate生成的日志名为app.log.1.gz、app.log.2.gz等,无法直观看出切割时间。可通过自定义日期格式提升可读性。
修改配置:
dateext dateformat %Y%m%d%H
这样切割后的文件名为app.log-2025031514.gz,清晰标识到小时。
注意:hourly + dateformat %Y%m%d%H组合能确保每小时生成唯一文件名,避免覆盖。
验证与调试
首次配置建议手动测试:
logrotate -d /etc/logrotate.d/myapp-hourly
-d启用debug模式,显示执行逻辑但不实际操作。
确认无误后可强制运行一次:
logrotate -f /etc/logrotate.d/myapp-hourly
检查/var/log/myapp/目录下是否生成带小时时间戳的压缩文件,并确认应用是否正常写入新日志。
基本上就这些。通过cron驱动+logrotate hourly配置,就能实现稳定可靠的按小时日志切割,无需引入额外工具。关键是配置独立的状态文件和合理的时间命名,避免冲突和混乱。










