当存在 * 并且在一个路径中的日志轮换中有一个显式文件名时,logrotate 的行为如何?

Ali*_*eza 2 linux logrotate uwsgi

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

有一个/etc/logrotate.d/用于 uwsgi的日志轮换配置文件:

"/var/log/uwsgi/*.log" "/var/log/uwsgi/*/*.log" {
  copytruncate
  daily
  rotate 5
  compress
  delaycompress
  missingok
  notifempty
}
Run Code Online (Sandbox Code Playgroud)

假设我有大约 12 个 uwsgi 模块,我想保留一个 uwsgi 应用程序日志文件比其他模块多,所以我有如下配置:

/var/log/uwsgi/app/MY_APP.log {
        daily
        missingok
        rotate 60
        compress
        delaycompress
        notifempty
        create 0640 www-data adm
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是我应该如何像上面那样创建日志轮换并保留*其他 11 个模块。我不想用相同的配置创建 11 个日志轮换,我应该怎么做才能只覆盖一个模块?

Jen*_*y D 5

首先,logrotate 没有简单的方法来覆盖文件的现有全局匹配。稍后在配置中简单地尝试添加更具体的匹配会给您一条错误消息。

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

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

"/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
}
Run Code Online (Sandbox Code Playgroud)

第二种方法是在第一个 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
}
Run Code Online (Sandbox Code Playgroud)

我推荐第一个版本;跟踪是否/何时添加更多应用程序可能是最简单的。