如何使用 logrotate 为特定日志文件指定多条规则?

如何使用 logrotate 为特定日志文件指定多条规则?

我有一个 logrotate.d 配置文件,如下所示:

/home/myapp/log/* {
    daily
    compress
    dateext
    ifempty
    delaycompress
    olddir /home/myapp/baklog
}

我想对一些特定的日志文件应用附加规则,例如“邮件”。如何仅对某些文件应用附加规则?

如果我在上面添加另一条与其他文件匹配的规则(例如/home/myapp/log/warning.log { ... },我会收到类似这样的错误error: /etc/logrotate.d/myapp:3 duplicate log entry for /home/myapp/log/warning.log

如何以重叠的方式指定匹配特定文件的多个规则?

答案1

正如 Ether 所观察到的,重叠路径是被故意禁止的。

如果您愿意并且能够在启用logrotateshell 选项的情况下运行extglobshopt -s extglob在 root 环境中运行crontab logrotate),或者已经设置了该选项(shopt extglob在相同环境中检查),那么您可以创建显式路径排除,否则logrotate.conf无法提供。您需要声明每个这样的排除。当然,更好的解决方案是重新配置日志系统以使用单独的目录来存放需要特殊处理的文件(如果可以的话)。

extglob可以声明以下内容:

/home/myapp/log/!(warning.log) {
    daily
    compress
    dateext
    ifempty
    delaycompress
    olddir /home/myapp/baklog
}

... 并且!(warning.log)将匹配除该文件之外的所有文件,允许您为其编写特定规则。这很麻烦,并且需要一些维护,因此,如果您可以配置应用程序的日志系统以将高优先级或其他特殊日志文件记录到单独的目录中,那就更好了。

答案2

在大多数发行版中你不能这样做。

看起来 Debian 做出了一个决定,允许覆盖特定文件的规则是错误的,因为软件包安装错误地安装重复规则变得很常见,而 logrotate 维护人员希望将其标记为错误。

因此,不管怎样,无论是通过使用更具体的通配符(log/[a-hj-z]*而不是log/*),使一般规则不适用于异常日志文件,还是通过更改应用程序配置以将异常日志文件放在不同的目录中,您都必须解决这个问题,这样就不会出现针对同一个日志文件的多个规则。

答案3

你不能。

提到的shopt -s extglob选项现在不起作用。我花了几个小时尝试使用它,但没有成功。

在 Debian 10(buster、bash 版本 5.0-4、logrotate 版本 3.14.0-4)和 Manjaro(基于 Arch)上进行了测试。

存在问题logrotate GitHub来启用这种 extglob 支持,但是现在没有什么好消息。

相关内容