通过创建systemd服务实现系统启动时自动切割日志。1. 创建logrotate-boot.service文件,设置在local-fs.target后执行logrotate -f /etc/logrotate.conf;2. 启用该服务使每次启动运行一次logrotate;3. 配置/etc/logrotate.d/myapp等策略文件,使用copytruncate等方式处理无法重载的服务;4. 重启验证日志是否被成功切割,并检查journalctl日志记录。此方法将logrotate从时间驱动扩展为事件驱动,适用于排查启动问题,但需注意copytruncate的丢日志风险及合理组合时间或大小条件避免频繁切割。

Linux系统中,日志文件会随着时间不断增长,影响系统性能和磁盘使用。logrotate是Linux自带的日志管理工具,通常按天、周或大小进行切割,但有时我们希望在系统每次启动时也触发日志切割——比如调试开机服务或排查启动问题。下面介绍如何配置logrotate实现按系统启动自动切割日志。
理解logrotate的启动机制
logrotate默认由cron定时执行,一般每天运行一次。它本身不直接支持“按启动切割”,但我们可以通过init系统(如systemd)在每次系统启动时主动调用logrotate,达到按启动切割的目的。
核心思路是:在系统启动完成后,立即执行一次logrotate,确保本次启动前的日志被归档,新启动产生的日志写入新的文件。
创建启动时执行的logrotate服务
以systemd为例,创建一个unit文件,在系统启动后运行logrotate:
1. 创建systemd service文件:
/etc/systemd/system/logrotate-boot.service
[Unit] Description=Logrotate on boot After=local-fs.target[Service] Type=oneshot ExecStart=/usr/sbin/logrotate -f /etc/logrotate.conf RemainAfterExit=yes
[Install] WantedBy=multi-user.target
2. 启用该服务:
运行以下命令启用开机执行:
sudo systemctl daemon-reexec sudo systemctl enable logrotate-boot.service
这样每次系统启动时,logrotate都会强制执行一次配置文件中的规则,完成日志切割。
配置日志文件的切割策略
编辑对应日志的logrotate配置,例如为自定义应用日志设置启动级切割:
/etc/logrotate.d/myapp
/var/log/myapp.log {
missingok
notifempty
copytruncate
daily
rotate 7
compress
postrotate
/bin/kill -USR1 `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
说明:
- copytruncate:适用于无法重载的服务,先复制日志再清空原文件,避免进程写入中断。
- daily:配合定时任务保留每日策略。
- 加上启动时执行,相当于“每次启动都可能切割一次”。
验证与注意事项
重启系统后,检查日志文件是否被成功切割:
ls /var/log/myapp.log*
查看logrotate日志(通常在/var/lib/logrotate/status 或通过journalctl)确认执行记录:
sudo journalctl -u logrotate-boot.service
注意:
- 避免频繁重复切割,建议结合时间或大小条件使用。
- 某些服务支持SIGHUP或USR1信号重载日志,优先使用
create+ 信号方式。 - copytruncate虽方便,但在高并发写入时有丢日志风险。
基本上就这些。通过systemd服务触发logrotate,可以轻松实现“按系统启动”切割日志的需求,特别适合用于诊断启动过程中的服务行为。关键是把logrotate从纯时间驱动扩展到事件驱动,提升日志管理灵活性。










