我有一个 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 文件,并且除了您真正关心的文件之外,还轮换这些文件。优化您的匹配规则以仅包含您感兴趣的文件,这样您就应该一切就绪了。