如何使用 logrotate 删除旧日志文件

如何使用 logrotate 删除旧日志文件

在我的CentOS中,有一个Logstash,它会生成许多日志文件。日志文件如下所示:

logstash-2023-03-09.log  logstash-2023-03-20.log                   logstash-deprecation-2023-03-08-1.log.gz  logstash-plain-2023-03-14-1.log.gz  logstash-plain-2023-03-25-1.log.gz
logstash-2023-03-10.log  logstash-2023-03-21.log                   logstash-deprecation-2023-03-09-1.log.gz  logstash-plain-2023-03-15-1.log.gz  logstash-plain-2023-03-26-1.log.gz
logstash-2023-03-11.log  logstash-2023-03-22.log                   logstash-deprecation-2023-03-10-1.log.gz  logstash-plain-2023-03-16-1.log.gz  logstash-plain-2023-03-27-1.log.gz
logstash-2023-03-12.log  logstash-2023-03-23.log                   logstash-deprecation.log                  logstash-plain-2023-03-17-1.log.gz  logstash-plain-2023-03-28-1.log.gz
logstash-2023-03-13.log  logstash-2023-03-24.log                   logstash-json.log                         logstash-plain-2023-03-18-1.log.gz  logstash-plain.log
logstash-2023-03-14.log  logstash-2023-03-25.log                   logstash-plain-2023-03-07-1.log.gz        logstash-plain-2023-03-19-1.log.gz  logstash-slowlog-json.log
logstash-2023-03-15.log  logstash-2023-03-26.log                   logstash-plain-2023-03-09-1.log.gz        logstash-plain-2023-03-20-1.log.gz  logstash-slowlog-plain.log
logstash-2023-03-16.log  logstash-2023-03-27.log                   logstash-plain-2023-03-10-1.log.gz        logstash-plain-2023-03-21-1.log.gz
logstash-2023-03-17.log  logstash-2023-03-28.log                   logstash-plain-2023-03-11-1.log.gz        logstash-plain-2023-03-22-1.log.gz
logstash-2023-03-18.log  logstash-2023-03-29.log                   logstash-plain-2023-03-12-1.log.gz        logstash-plain-2023-03-23-1.log.gz
logstash-2023-03-19.log  logstash-deprecation-2023-03-07-1.log.gz  logstash-plain-2023-03-13-1.log.gz        logstash-plain-2023-03-24-1.log.gz

所有这些都是由 Logstash 生成的。

现在我想用logrotate它们来删除旧文件。

这是我的配置logrotate

[envoy@mirror-dfh0splogv logstash]$ cat /etc/logrotate.d/logstash
/var/log/logstash/logstash-20*.log {
    daily
    rotate 15
    compress
    delaycompress
}

/var/log/logstash/logstash-plain*.log.gz {
    daily
    rotate 5
}

我想要的其实很简单。对于logstash-20*.log文件,我只想保留最新的 15 个文件。对于logstash-plain*.log.gz,我只想保留最新的 5 个。

但是,当我执行命令时logrotate --force /etc/logrotate.d/logstash,所有文件名都会附加.1,并且不会删除任何文件:

logstash-2023-03-09.log.1  logstash-2023-03-20.log.1  logstash-deprecation-2023-03-07-1.log.gz  logstash-plain-2023-03-13-1.log.gz.1  logstash-plain-2023-03-24-1.log.gz.1
logstash-2023-03-10.log.1  logstash-2023-03-21.log.1  logstash-deprecation-2023-03-08-1.log.gz  logstash-plain-2023-03-14-1.log.gz.1  logstash-plain-2023-03-25-1.log.gz.1
logstash-2023-03-11.log.1  logstash-2023-03-22.log.1  logstash-deprecation-2023-03-09-1.log.gz  logstash-plain-2023-03-15-1.log.gz.1  logstash-plain-2023-03-26-1.log.gz.1
logstash-2023-03-12.log.1  logstash-2023-03-23.log.1  logstash-deprecation-2023-03-10-1.log.gz  logstash-plain-2023-03-16-1.log.gz.1  logstash-plain-2023-03-27-1.log.gz.1
logstash-2023-03-13.log.1  logstash-2023-03-24.log.1  logstash-deprecation.log                  logstash-plain-2023-03-17-1.log.gz.1  logstash-plain-2023-03-28-1.log.gz.1
logstash-2023-03-14.log.1  logstash-2023-03-25.log.1  logstash-json.log                         logstash-plain-2023-03-18-1.log.gz.1  logstash-plain.log
logstash-2023-03-15.log.1  logstash-2023-03-26.log.1  logstash-plain-2023-03-07-1.log.gz.1      logstash-plain-2023-03-19-1.log.gz.1  logstash-slowlog-json.log
logstash-2023-03-16.log.1  logstash-2023-03-27.log.1  logstash-plain-2023-03-09-1.log.gz.1      logstash-plain-2023-03-20-1.log.gz.1  logstash-slowlog-plain.log
logstash-2023-03-17.log.1  logstash-2023-03-28.log.1  logstash-plain-2023-03-10-1.log.gz.1      logstash-plain-2023-03-21-1.log.gz.1
logstash-2023-03-18.log.1  logstash-2023-03-29.log    logstash-plain-2023-03-11-1.log.gz.1      logstash-plain-2023-03-22-1.log.gz.1
logstash-2023-03-19.log.1  logstash-2023-03-29.log.1  logstash-plain-2023-03-12-1.log.gz.1      logstash-plain-2023-03-23-1.log.gz.1

答案1

执行此操作的正确方法是在应用程序内的 log4j2 配置中,请参阅例如:

appender.rolling.strategy.delete.ifLastModified.age = 30d

logrotate删除已经被 Logstash 有效轮换的文件,您需要说服它旧的日志文件确实是由它自己创建的。因此,对于诸如 之类的旧文件 logstash-2023-03-09.log,您需要说要旋转的原始文件是 logstash,并且要使用的旋转机制是添加日期扩展格式-%Y-%m-%d.log。这会产生一个类似的配置文件

# for eg logstash-2023-03-09.log
"logstash" {
 dateext
 dateformat -%Y-%m-%d.log
 daily
 rotate 15
}

为此,即使使用--force,“触发”文件logstash也必须存在,因此需要在第一次运行之前手动将其创建为空。因为它将被旋转到,比如说,logstash-2023-04-01.log如果那是今天的日期,我们还需要create重新创建触发器文件的选项。我们还需要删除伪造的重命名文件。配置文件可能会变成:

# for eg logstash-2023-03-09.log
"logstash" {
 dateext
 dateformat -%Y-%m-%d.log
 daily
 rotate 15
 create
 postrotate
  f=logstash-$(date +%Y-%m-%d).log; [ ! -s "$f" ] && rm "$f"
 endscript
}

我们检查要删除的文件是否为空,以防日志记录应用程序首先创建它,在这种情况下 logrotate 将不会旋转触发器文件。

文件的类似条目可能logstash-plain-2023-03-25-1.log.gz 是:

# for eg logstash-plain-2023-03-25-1.log.gz
"logstash-plain" {
 dateext
 dateformat -%Y-%m-%d-1.log.gz
 daily
 rotate 5
 create
 postrotate
  f=logstash-$(date +%Y-%m-%d)-1.log.gz; [ ! -s "$f" ] && rm "$f"
 endscript
}

触发器文件logstash-plain也必须手动创建。

这是一种黑客行为,因此请尝试在单独的目录中复制文件副本,并且不使用--force.等待 24 小时进行第二次运行,并用于-v确认所发生的情况。

相关内容