应将所有需轮转的日志路径写在同一配置块并启用sharedscripts,确保postrotate脚本仅执行一次;使用systemctl reload rsyslog(或syslog-ng)安全重启,配合is-active检查与|| true防错。

要利用 Logrotate 的 sharedscripts 在轮转所有匹配日志后**只执行一次**重启 syslog(如 rsyslog 或 syslog-ng),关键在于正确配置全局选项、避免每个文件单独触发脚本,并确保重启命令适配你系统实际使用的 syslog 服务。
理解 sharedscripts 的作用范围
sharedscripts 不是“对所有日志统一处理”,而是让同一 logrotate 配置块(即同一组 files)中的所有日志文件,在完成轮转后,**共用一套 postrotate / endscript 脚本**,且该脚本仅运行一次(而非每个文件各运行一次)。
因此,必须把所有需统一重启 syslog 的日志路径写在同一个配置段中,不能分散在多个独立的 /etc/logrotate.d/xxx 文件里(否则每个文件都会各自执行自己的脚本)。
正确配置 logrotate(以 rsyslog 为例)
编辑或新建一个集中配置文件,例如 /etc/logrotate.d/syslog-common:
/var/log/messages
/var/log/secure
/var/log/maillog
/var/log/kern
/var/log/boot.log
{
daily
missingok
notifempty
sharedscripts
delaycompress
compress
postrotate
# 只有当 rsyslog 确实正在运行时才重启
if systemctl is-active --quiet rsyslog; then
systemctl reload rsyslog 2>/dev/null || true
fi
endscript
}
说明:
- 所有日志路径列在同一配置块内,启用
sharedscripts - 使用
systemctl reload rsyslog(非 restart)更安全:reload 会重新加载配置并接管新日志文件,不中断日志接收 -
systemctl is-active --quiet避免在服务未启用时报错;|| true防止脚本因非零退出码导致 logrotate 报告失败 - 若用的是
syslog-ng,将rsyslog替换为syslog-ng,命令改为systemctl reload syslog-ng
验证与调试方法
不要等自动轮转,用以下命令手动测试配置是否生效:
-
logrotate -d /etc/logrotate.d/syslog-common:显示详细执行过程(dry-run,不真实轮转),确认是否进入postrotate及调用次数 -
logrotate -f /etc/logrotate.d/syslog-common:强制执行一次(注意可能清空当前日志),观察journalctl -u rsyslog是否有 reload 记录 - 检查轮转后新日志权限/归属是否正常(尤其当 syslog 以特定用户运行时),必要时在
postrotate中补上chown或chmod
常见陷阱提醒
以下情况会导致 sharedscripts 失效或重启不生效:
- 日志路径被多个不同配置文件匹配(如
/etc/logrotate.d/rsyslog和自定义文件同时包含/var/log/messages)→ 造成重复轮转和多次脚本执行 - 配置中混用了
prerotate但没配sharedscripts→ 它默认不共享,仍按文件逐个执行 - 重启命令写成
service rsyslog restart且系统已启用 systemd → 可能静默失败,应优先用systemctl - SELinux 启用时,
postrotate脚本可能因策略限制无法调用 systemctl → 临时设为 permissive 模式排查,或调整策略模块


















