问题有点长!让我用下面的例子来解释一下。我
/etc/logrotate.d/
有一个用于 uwsgi 的log-rotation 配置文件:
"/var/log/uwsgi/*.log" "/var/log/uwsgi/*/*.log" {
copytruncate
daily
rotate 5
compress
delaycompress
missingok
notifempty
}
假设我有大约 12 个 uwsgi 模块,并且我想保留其中一个 uwsgi 应用程序日志文件,因此我有一个如下配置:
/var/log/uwsgi/app/MY_APP.log {
daily
missingok
rotate 60
compress
delaycompress
notifempty
create 0640 www-data adm
}
现在的问题是我应该如何创建上述日志轮换并保留*
其他 11 个模块。我不想使用相同的配置创建 11 个日志轮换,我应该怎么做才能仅覆盖一个模块?
答案1
首先,logrotate 没有简单的方法来覆盖文件的现有 glob 匹配。简单地尝试在配置中添加更具体的匹配将给出错误消息。
因此,为了解决这个问题,基本上有两种方法。
第一个最简单的方法是:将需要不同处理的日志放在不同的目录中。这样,您甚至可以通过将应用程序日志放到不同的目录中来轻松更改配置。示例:
"/var/log/uwsgi/*.log" "/var/log/uwsgi/keep05/*.log" {
copytruncate
daily
rotate 5
compress
delaycompress
missingok
notifempty
}
"/var/log/uwsgi/keep60/*.log" {
daily
missingok
rotate 60
compress
delaycompress
notifempty
create 0640 www-data adm
}
第二种方法将会创建一个排除在第一个 glob 中,匹配所有 12 个日志。但由于 logrotate 没有简单的方法来排除特定文件,因此您只能使用常规文件名匹配库提供的内容 - 而这实际上只是文件名中的一个字符。如果您制定规则,即需要保留 60 天的日志必须以 6 开头,并且其他日志都不能以 6 开头,您可以这样做:
"/var/log/uwsgi/*.log" "/var/log/uwsgi/*/[!6]*.log" {
copytruncate
daily
rotate 5
compress
delaycompress
missingok
notifempty
}
"/var/log/uwsgi/app/6*.log" {
daily
missingok
rotate 60
compress
delaycompress
notifempty
create 0640 www-data adm
}
我推荐第一个版本;如果/当您添加更多应用程序时,它可能最容易跟踪。