在我的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
确认所发生的情况。