我有一台 CentOS 机器,运行 rsyslog 和 logrotate 作为一大堆网络设备的系统日志服务器。我已经研究了一段时间了,logrotate/压缩部分工作正常,但我似乎无法让它删除旧的压缩 .gz 日志。以下是基本设置:
日志存储在:/var/log/syslog 中,每个主机根据其 IP 地址或主机名创建一个新的子文件夹。我有两个特别频繁的主机,所以我有特定的规则让它们在 5 GB 后截断。这个想法是每天压缩并开始一个新的日志,并保留 60 天的日志。
以下是我的配置(其中大部分不是我创建的,但我维护和修改了其中的几个):
cat /etc/cron.hourly/logrotate
#!/bin/sh`enter code here`
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
猫/etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
compress
daily
#delaycompress
dateext
missingok
rotate 60
maxage 60
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
猫/etc/logrotate.conf
/var/log/syslog/*/*.log {
daily
rotate 60
maxage 60
compress
}
daily
rotate 60
create
dateext
compress
include /etc/logrotate.d
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
# Specific rule for HOST_A
/var/log/syslog/HOST_A/*.log {
daily
size 5G
rotate 30
maxage 30
compress
}
# Specific rule for HOST_B
/var/log/syslog/HOST_B/*.log {
daily
size 5G
rotate 30
maxage 30
compress
}
下面是我的 \var\log\syslog\host_a 文件夹中的内容示例:
ls /var/log/syslog/HOST_A/ | wc -l
104
ls /var/log/syslog/HOST_A/-lh
-rw------- 1 root root 416M Jun 20 23:59 HOST_A_2018_06_20.log.1.gz
-rw------- 1 root root 64M Jun 20 16:18 HOST_A_2018_06_20.log.2.gz
-rw------- 1 root root 1.5G Jun 21 23:59 HOST_A_2018_06_21.log.1.gz
<many files redacted>
-rw------- 1 root root 1.6G Sep 4 23:59 HOST_A_2018_09_04.log.1.gz
-rw------- 1 root root 1.5G Sep 5 23:59 HOST_A_2018_09_05.log.1.gz
-rw------- 1 root root 7.7G Sep 6 10:58 HOST_A_2018_09_06.log
因此,如上所示,它不会在 60 天后删除旧的存档 .gz 日志。它会无限期地保留它们。我不得不定期进入并手动删除旧文件以减小大小。这些文件从 6/20 到 9/6(今天),也就是 104 天。我确定我的配置有误,但不确定我遗漏了什么。任何帮助都将不胜感激。
答案1
您正在使用两种机制来处理每日日志文件,但它们彼此之间不能相互协作。
一方面,您让 syslog 生成每日文件,另一方面,您让 logrotate 轮换文件。Logrotate 会将每个每日文件视为一组单独的独特文件(它不认为 HOST_A_2018_09_05.log 与 HOST_A_2018_09_06.log 相关)进行轮换,因此它永远不会达到每个模式 5 个文件。
最好不要在文件名中包含日期,或者让 syslog 自行修剪旧文件。