我正在测试 logrotate 配置/tmp
。我想
/tmp/*.log
使用我的测试配置文件为文件配置默认的 logrotate 策略/tmp/logrotate.conf
/tmp/special.log
使用在单独的 logrotate 配置测试文件中配置的不同策略来处理特定的日志文件:/tmp/logrotate.d/included
但是logrotate对我的配置的响应是说:
error: /tmp/logrotate.d/included:1 duplicate log entry for /tmp/special.log
我应该做些什么不同的事情?
这是我的/tmp/logrotate.conf
compress
missingok
notifempty
size 512k
copytruncate
rotate 2
su
# here's my attempt at applying the default policy to all /tmp/*.log
/tmp/*.log {}
# and here I intend to include any overrides
include /tmp/logrotate.d/included
这是/tmp/logrotate.d/included
/tmp/special.log {
size 300
}
这是调试输出。
$ sudo logrotate -d ./logrotate.conf
reading config file ./logrotate.conf
including /tmp/logrotate.d/included
reading config file /tmp/logrotate.d/included
error: /tmp/logrotate.d/included:1 duplicate log entry for /tmp/special.log
Handling 2 logs
rotating pattern: /tmp/*.log 524288 bytes (2 rotations)
empty log files are not rotated, old logs are removed
considering log /tmp/normal.log
log does not need rotating
considering log /tmp/special.log
log does not need rotating
rotating pattern: /tmp/special.log 300 bytes (2 rotations)
empty log files are not rotated, old logs are removed
No logs found. Rotation not needed.
- 这个错误让我很惊讶,因为我认为根据手册页“后面的配置文件可能会覆盖前面文件中给出的选项,因此 logrotate 配置文件的列出顺序很重要。”
- 为什么在处理模式时最后会说
/tmp/special.log
没有找到日志?该文件/tmp/special.log
存在并且大于 300 字节。
答案1
的开发人员logrotate
有意禁止重叠的日志文件定义,因此虽然允许更具体的规则遵循配置中的一般规则,但日志文件路径重叠仍会产生错误。这在一定程度上是为了包括 logrotate 规则的软件包维护者和这些软件包的用户的利益,这样重叠就会变得明显并且可以报告。
如果特定规则和通用规则日志文件必须驻留在同一个目录中(您可以重新配置以移动它们吗?),那么您必须为每个重叠路径创建并维护通用规则的明确排除。 logrotate.conf
没有明确提供这一点,但如果您的logrotate
运行环境extglob
启用了 shell glob-extensions,则可以进行排除。您可以extglob
通过在 crontab logrotate 将运行的相同根环境中运行来检查是否已启用shopt extglob
,并且可以使用 明确启用它(如果需要)shopt -s extglob
。
一旦extglob
启用,它允许构造如下:
/tmp/!(special).log {}
...这将防止与您后续更具体的规则重叠,从而避免错误。
答案2
正如 @javabrett 已经写的那样,logrotate 似乎有意禁止重叠规则。不过,我找到了另一种优先考虑重叠规则的方法:
规则logrotate.conf
是从上到下执行的,因此请确保将更具体的匹配规则放在通用规则之上。
然后,您可以使用该ignoreduplicates
指令让 logrotate 忽略文件中与该规则匹配的其他规则。
在您的示例中:
compress
missingok
notifempty
size 512k
copytruncate
rotate 2
su
/tmp/special.log {
size 300
ignoreduplicates
}
# here's my attempt at applying the default policy to all /tmp/*.log
/tmp/*.log {}
为了简单起见,我把所有规则都放到了同一个文件中。我有不是检查是否仅通过将include
指令上移,从另一个文件包含进来仍然有效。
在当今世界,定期的 logrotate 作业可能会作为 systemd 计时器运行,而不需要适当的 shell,这是一个比摆弄 shell 通配符更为强大的解决方案。