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

Eth*_*her 8 logrotate

我有一个 logrotate.d 配置文件,看起来像这样:

/home/myapp/log/* {
    daily
    compress
    dateext
    ifempty
    delaycompress
    olddir /home/myapp/baklog
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Old*_*Pro 2

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

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

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

  • 您还可以更改应用程序配置,以将您想要特殊对待的文件记录到不同的目录中...我认为 logrotate 还不够复杂,无法完成您想要的操作,或者实际上应该如此。如果应用程序正在生成任意命名的日志,也许您可​​以将这些日志放在不同的地方,然后将此目录中的每个日志指定为两个或三个列表。 (4认同)
  • 问题与我在单个文件中进行覆盖相同(这是合法的):如果我有覆盖,则无法对该目录中的其余文件使用通配符,而不会出现以下错误:问题中引用。如果我错了,请提供一个有效的例子? (3认同)
  • 通配符不能排除 - 没有办法说“除了这个文件之外的所有内容”。 (2认同)
  • @Ether,是的,您不能在通配符中指定“除此一个文件之外的所有文件”,但您可以执行类似“[a-hj-z]*”的操作来选择除“之外”以外的所有以小写字母开头的文件我`。如果您的特殊文件是唯一一个名称以“i”开头的文件,那么这将是“一个通配符,排除您想要使用不同选项设置的文件”。 (2认同)