EC2にS3バケットをマウントして古いsyslogを保管(3) ~ローテート設定~

takaokaです。
前回、前々回に続き、今回はログローテーションの設定をしてみたいと思います。
■ローテートの例
・/etc/logrotate.d/syslogに記載されている下記のログをローテート対象としてみます。
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
・世代数は「2」としました。
■設定について
ローテーション設定で、指定したディレクトリにローテート可能な「olddir」というコマンドがありますが、ローカルデバイスのみにしか対応していません。このため少々シェルコマンドを使いローテートをする設定を入れこみます。
■/etc/logrotate.d/syslog を編集します
変更前(デフォルト値)
# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
#
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
#
変更後
# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
rotate=2
archive_dir=/var/log/archive/
for logname in $*
do
mv ${logname}-`date +%Y%m%d` ${archive_dir}
find ${archive_dir} -name “`basename ${logname}`-∗” -mtime +${rotate} -exec rm -f {} \;
done
endscript
}
#
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
rotate=2
archive_dir=/var/log/archive/
for logname in $*
do
mv ${logname}-`date +%Y%m%d` ${archive_dir}
find ${archive_dir} -name “`basename ${logname}`-∗” -mtime +${rotate} -exec rm -f {} \;
done
endscript
}
#
黄色文字が追加した記述です。
・$rotateに世代数(世代日数)、$archive_dirにS3のマウントポイントを定義しています。
・for文で$∗を回します。$∗には/var/log/cron、/var/log/maillog、・・・が代入されていくので、$lognameに格納します。
・mvコマンドでローテートされた当日ファイル名のファイルを$archive_dirに移動します。
・findコマンドで$archive_dirを起点として$logname-∗のファイルを検索し、$rotate(世代日数)より過去のファイルを削除しています。
この設定以降、ローテートのタイミングで2世代は常にS3側へ保存されます。