logrotate:如何配置和覆盖默认值?

logrotate:如何配置和覆盖默认值?

我正在测试 logrotate 配置/tmp。我想

  1. /tmp/*.log使用我的测试配置文件为文件配置默认的 logrotate 策略/tmp/logrotate.conf
  2. /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.
  1. 这个错误让我很惊讶,因为我认为根据手册页“后面的配置文件可能会覆盖前面文件中给出的选项,因此 logrotate 配置文件的列出顺序很重要。”
  2. 为什么在处理模式时最后会说/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 通配符更为强大的解决方案。

相关内容