对于我的日志文件,我遇到的问题是,除了一个(或几个)文件外,其他文件都使用相同的配置,而其余文件则使用另一个配置。我尝试通过为所有文件提供通用配置,然后稍后为几个特定文件覆盖此配置来实现这一点,例如:
/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]....或者找到另一种方法来仅针对该文件