我在 CentOS 上运行 rsyslog,并使用 logrotate 轮换我的日志。所有主机都以以下方式将其日志写入其各自单独目录中的 /var/log/syslog/:
/var/log/syslog/host1
/var/log/syslog/host2
/var/log/syslog/host3
/var/log/syslog/host4
/var/log/syslog/host5
/var/log/syslog/host6
/var/log/syslog/host7
/var/log/syslog/host8
每个目录下都有一个需要轮换的文件,例如“host1.log”。唯一的问题是,我有两个主机的日志非常大(host3 和 host7),需要使用不同的保留计划进行轮换。我想在这两个特定主机上保留日志 45 天,但所有其他主机应保留 120 天。问题是它们是按字母顺序排列的,无法正确处理。我尝试在我的 /etc/logrotate.conf 文件中创建这样的单独策略:
/var/log/syslog/host3/*.log {
daily
rotate 45
maxage 45
compress
dateext
dateyesterday
}
/var/log/syslog/host7/*.log {
daily
rotate 45
maxage 45
compress
dateext
dateyesterday
}
# Everything else
/var/log/syslog/*/*.log {
daily
rotate 120
maxage 120
compress
dateext
dateyesterday
}
当我运行这个程序时,它会像预期的那样,每隔 45 天轮换 host3 和 host7。然后,当它到达 /var/log/syslog//.log 部分,它仅处理到 host3,然后停止。因此,基本上,host4、host5、host6 和 host8 永远不会被考虑轮换。
我尝试更改 /etc/logrotate.conf 文件中的顺序,将“所有”规则放在顶部,如下所示:
# Everything else
/var/log/syslog/*/*.log {
daily
rotate 120
maxage 120
compress
dateext
dateyesterday
}
/var/log/syslog/host3/*.log {
daily
rotate 45
maxage 45
compress
dateext
dateyesterday
}
/var/log/syslog/host7/*.log {
daily
rotate 45
maxage 45
compress
dateext
dateyesterday
}
当我这样运行它时,它会使用第一条规则将我的所有主机设置为 120 天轮换,然后忽略我对 host3 和 host7 的特定规则。当它到达这些目录时,它会显示:
rotating pattern: /var/log/syslog/host3/*.log after 1 days (45 rotations)
empty log files are rotated, old logs are removed
No logs found. Rotation not needed.
因此,我的问题是,如何设置 /etc/logrotate.conf 文件以允许对不同目录使用不同的规则?这可能吗?
答案1
我将明确包含除 和 之外的主机的路径host3
,而host7
不是使用包含它们的通配符,这会使它们配置两次,这意味着它们将仅遵循存在的第一个配置。您可能想尝试这个:
/var/log/syslog/host3/*.log var/log/syslog/host7/*.log {
daily
rotate 45
maxage 45
compress
dateext
dateyesterday
}
# Everything else
/var/log/syslog/*/*.log {
daily
rotate 120
maxage 120
compress
dateext
dateyesterday
prerotate
bash -c "[[ ! $1 =~ host3 ]] && [ ! $1 =~ host7 ]]"
endscript
}