logrotate-在所有处理之后运行postrotate

logrotate-在所有处理之后运行postrotate

我有一个 logrotate 脚本,用于轮换 syslog 收集的日志。该脚本的一部分是重新加载 syslog 进程。问题是 syslog 重新加载会针对它轮换的每个匹配日志文件运行,并且大约有 100 个。我如何设置 logrotate 脚本以在处理完所有单个日志后仅重新加载一次 syslog 进程?

/logs/* {
   daily
   rotate 7
   compress
   postrotate
      /etc/init.d/syslog-ng reload 2>/dev/null
   endscript
}

答案1

使用共享脚本

通常,logrotate 每次轮转日志时都会运行 postrotate 脚本。对于使用相同配置块的多个日志,情况也是如此。例如,如果一个 Web 服务器配置块同时引用访问日志和错误日志,并且轮转两者,则它会运行 postrotate 脚本两次(轮转每个文件一次)。如果轮转两个文件,则 Web 服务器会重新启动两次。

为了防止 logrotate 为每个日志运行该脚本,您可以包含以下命令:

sharedscripts 此命令指示 logrotate 在运行 postrotate 脚本之前检查该配置块的所有日志。如果其中一个或两个日志被轮换,postrotate 脚本仅运行一次。如果没有日志被轮换,postrotate 脚本不会运行。

答案2

如果其他人偶然发现这一点,应该注意 logrotate 在手册页中定义的各个点支持几个脚本。

man logrotate

您可以用“lastaction”替换“postrotate”选项:

lastaction/endscript 在与通配符模式匹配的所有日志文件轮换后、在运行 postrotate 脚本后并且只有至少有一个日志轮换时,lastaction 和 endscript 之间的行(它们必须单独出现在行上)才会执行(使用 /bin/sh)一次

答案3

/logs/*

^^^ 您的通配符也匹配您的 *.gz 文件,并且除了您真正关心的文件之外,还轮换这些文件。优化您的匹配规则以仅包含您感兴趣的文件,这样您就应该一切就绪了。

相关内容