シェルスクリプトマガジン

最終回 不正アクセスを通知する

 また、一つのファイルに多くのログがたまらないように、ある期間でログファイルを切り替えるようにしています。具体的には、定期ジョブ実行のデーモン「crond」によって、次のシェルスクリプト(cron.daily/logrotate)が1日1回実行され、最後の行に記述された「logrotate」コマンドでログファイルを切り替えています。

#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
    [ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

 logrotateコマンドの引数に指定している「/etc/logrotate.conf」が、logrotateコマンドの設定です。この/etc/logrotate.confファイルの19行目に、

include /etc/logrotate.d

があり、ログの切り替え設定は「/etc/logrotate.d」ディレクトリの下にあるファイルに書き込まれています。

 前述したようにログインのログはrsyslogdで取得しています。rsyslogdに関する、logrotateコマンドの設定は「/etc/logrotate.d/rsyslog」ファイルに書き込まれています。そして、認証やセキュリティに関するログファイルの/var/log/auth.logに関する設定は、次のように書かれています。

(略)
/var/log/auth.log
(略)
{
        rotate 4
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}

 「rotate 4」でログを別々のファイルで4世代保存し、「weekly」で週1回切り替えて、「compress」で圧縮するように設定されています。

 ログが複数のファイルに分かれていたり、圧縮されていたりするとシェルスクリプトから処理するのが大変です。よって、シェルスクリプト用にログを別ファイルに保存して切り替えられないようにします。