如何在 logrotate 配置文件中指定通配符设置的例外情况?

MRA*_*MRA 14 ubuntu configuration logrotate

对于我的日志文件,我遇到的问题是除了一个(或几个)文件之外的所有文件都使用相同的配置,而其余文件则有另一个。我试图通过为所有文件提供通用配置来实现这一点,然后稍后为少数特定文件覆盖此配置,例如:

/var/log/mylogs/*.log {
                   size 1000k
                   copytruncate
                   create 0644 root root
                   rotate 99
                   compress
                   missingok
}

/var/log/mylogs/thatonespecial.log {
                   size 1000k
                   copytruncate
                   create 0644 myuser mygroup
                   rotate 99
                   compress
                   missingok
}
Run Code Online (Sandbox Code Playgroud)

但是,这会引发错误:

error: /var/log/mylogs/logrotate.conf:10 duplicate log entry for /var/log/mylogs/thatonespecial.log
Run Code Online (Sandbox Code Playgroud)

我应该如何正确处理这种情况?我当然不想单独列出大量标准日志文件,因此使用通配符配置对我来说似乎是合理的。但是我怎样才能在通配符文件中指定一个例外呢?

Hyp*_*ppy 10

最优雅的答案是放在thatonespecial.log一个单独的目录中,这样它就无法匹配通配符。

如果这不起作用,那么您可以使用glob来缩小通配符的范围。它很乱,但如果你绝对不能移动文件位置,那么它可能是你唯一真正的选择。像这样的东西:

/var/log/mylogs/[!t][!h]*.log
Run Code Online (Sandbox Code Playgroud)

将匹配名称中至少包含 2 个字符且不以“th”开头的任何 .log 文件。

  • 这不会按预期工作。文件名`that.log` 将被忽略,但文件名`txxx.log` 也将被忽略。出于某种原因,`[!h]` 部分没有发挥任何作用。一旦文件以 `t` 开头,它就会被忽略。 (2认同)

Ika*_*ský 7

似乎已经实现了规则的覆盖,现在可以使用了:

$ logrotate --version
logrotate 3.8.7

$ cat /etc/logrotate.d/test
# rotate application logs for 40 days by default
/home/myapp/log/*.log
/home/myapp/log/*/*.log
{
    daily
    compress
    delaycompress
    rotate 40
}

# rotate access logs for 1 year
/home/myapp/log/access/*.log {
    daily
    compress
    delaycompress
    rotate 365
}

$ logrotate  -d /etc/logrotate.d/test
reading config file /etc/logrotate.d/test

Handling 2 logs

rotating pattern: /home/myapp/log/*.log
/home/myapp/log/*/*.log
 after 1 days (40 rotations)
empty log files are not rotated, old logs are removed
No logs found. Rotation not needed.

rotating pattern: /home/myapp/log/access/*.log  after 1 days (365 rotations)
empty log files are not rotated, old logs are removed
No logs found. Rotation not needed.
Run Code Online (Sandbox Code Playgroud)

在我的本地 logrotate(版本 3.7.8)上测试时,出现了错误:

$ cat logr.conf 
# rotate application logs for 40 days by default
/home/myapp/log/*.log
/home/myapp/log/*/*.log
{
    daily
    compress
    delaycompress
    rotate 40
}

# rotate access logs for 1 year
/home/myapp/log/access/*.log {
    daily
    compress
    delaycompress
    rotate 365
}

$ logrotate -d logr.conf 
reading config file logr.conf
reading config info for /home/myapp/log/*.log
/home/myapp/log/*/*.log

error: logr.conf:12 duplicate log entry for /home/myapp/log/access/api_access.log
error: found error in /home/myapp/log/access/*.log , skipping
removing last 1 log configs

...
Run Code Online (Sandbox Code Playgroud)