私は CentOS ボックスで rsyslog と logrotate を syslog サーバーとして実行しており、多数のネットワーク デバイスに使用しています。しばらくこれをいじっていますが、logrotate/圧縮部分は正常に動作していますが、古い圧縮された .gz ログを削除できないようです。基本的な設定は次のとおりです。
ログは /var/log/syslog に保存され、各ホストは IP アドレスまたはホスト名に基づいて新しいサブフォルダーを作成します。非常に通信量の多いホストが 2 つあるため、5 GB を超えると切り捨てるという特定のルールを設定しています。目的は、毎日ログを圧縮して新しいログを開始し、60 日分のログを保持することです。
これが私の設定です (これらのほとんどは私が作成したものではありませんが、いくつかは私が管理および変更したものです)。
/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 フォルダーにある内容の例です。
/var/log/syslog/HOST_A/ を ls します | 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
毎日のログファイルに 2 つのメカニズムを使用していますが、それらは相互に連携していません。
一方で、syslog に毎日のファイルを生成させ、他方で logrotate にファイルをローテーションさせます。logrotate は、毎日の各ファイルを個別の一意のファイル セットとして処理してローテーションするため (HOST_A_2018_09_05.log が HOST_A_2018_09_06.log と関連しているとは見なしません)、パターンごとに 5 つのファイルに達することはありません。
ファイル名に日付を含めないか、syslog に古いファイルの削除を自主的に実行させる方がよいでしょう。