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

如何在 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
}

然而,这会引发一个错误:

error: /var/log/mylogs/logrotate.conf:10 duplicate log entry for /var/log/mylogs/thatonespecial.log

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

答案1

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

如果这不起作用,那么你可以使用全局变量来缩小通配符的范围。这很麻烦,但如果你绝对不能移动文件位置,那么这可能是你唯一的选择。像这样:

/var/log/mylogs/[!t][!h]*.log

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

答案2

看来规则覆盖已经实现并且现在可以正常工作:

$ 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.

在我的本地 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

...

答案3

如果您知道所有日志的名称,您也可以在一条规则中一起指定它们:

/var/log/mylogs/{file1,file2,file3,file4,file5}.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
}

答案4

谢谢嬉皮 我在这里遇到了同样的问题,您的解决方案([!x][!y]*.log)工作得很好,我试图将您的答案评为有用,但我仍然没有足够的声誉:(所以,这是我的感谢你

对于弗卢利赫,在您的配置( [!access] )中请记住,括号内的所有字符都用于捕获一个字符,因此您的配置将仅捕获以 a、c、e 和 s 开头的文件而不是(!)仅(仅第一个字符,好吗?)这里有很好的参考:https://manpages.ubuntu.com/manpages/noble/en/man7/glob.7.html (关于补充款)

您应该将其扩展为 [!a][!c][!c][!e]....或者找到另一种方法来仅针对该文件

相关内容