如果logrotate的行为有*,并且在一个path中有一个明确的文件名在日志中旋转?

这个问题有点长! 让我来解释下面的例子。 一世

/etc/logrotate.d/有一个日志轮转configuration文件,用于uwsgi

 "/var/log/uwsgi/*.log" "/var/log/uwsgi/*/*.log" { copytruncate daily rotate 5 compress delaycompress missingok notifempty } 

比方说,我有大约12个uwsgi模块,我想保留一个uwsgi应用程序日志文件比其他更多,所以我有一个如下configuration:

 /var/log/uwsgi/app/MY_APP.log { daily missingok rotate 60 compress delaycompress notifempty create 0640 www-data adm } 

现在的问题是,我应该如何创build日志旋转,如上所述,并保留*为其他11个模块。 我不想创build11日志旋转相同的configuration,我应该怎么做只覆盖一个模块?

首先,logrotate没有简单的方法来覆盖文件的现有glob匹配。 稍后在configuration中添加一个更具体的匹配会给你一个错误信息。

所以为了解决这个问题,基本上有两种方法。

第一个是最简单的:将需要不同处理的日志放在不同的目录中。 这样,您甚至可以简单地通过将应用程序logging到不同的目录来轻松更改configuration。 例:

 "/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中创build一个排除 ,匹配全部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 } 

我推荐第一个版本; 如果/添加更多的应用程序,可能最容易跟踪。