Linuxのシスログ(messages)の保存期間を3ヶ月間に変更する
目次
構成
サーバ構成
OSバージョン
Red Hat Enterprise Linux 5.9 x86_64
環境構築
設定
Linuxのログローテート機能では、ローテート対象の全ファイルに共通的な設定をまとめた 設定ファイル(/etc/logrotate.conf)と、ローテート対象の個々のファイル毎の設定をまとめた 設定ファイル(/etc/logrotate.d/配下の各ファイル)が存在しています。 今回はLinuxのシスログに関する設定のみを変更したいため、後者のローテート対象毎の 設定ファイルを編集します。
デフォルトでは1週間に1回messagesをローテートし、4週間(=約1ヶ月)のログを 保持するような設定になっています。 1ヶ月ではちょっと短いので、3ヶ月(=約90日=約13週間)ログを残す設定に変更します。
以下で設定している内容には一部冗長な設定もありますが、 分かり易さ優先で設定しています。
# cd /etc/logrotate.d/ # vi syslog
【変更前】 /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true endscript } | |変更 ↓ 【変更後】 /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron { weekly ←追加(前回のローテートから1週間以上経過したらローテート) rotate 13 ←追加(バックアップを13世代保持する) missingok ←追加(対象のファイルがなくてもエラーにしない) sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true endscript }
設定ファイルを見て分かるとおり、この設定ファイルはmessagesのみでなく、 secure、maillog、spooler、boot.log、cron、つまりsyslogdを利用してログ出力 しているもの全てに設定が適用されます。
ログローテート機能には常駐プロセスは存在していません。 cronから定刻に呼び出されて実行されます。 そのため、設定ファイル変更後にサービスの再起動は必要ありません。
補足: ログローテートの自動実行
ログローテートがどのように実行されるか補足しておきます。
ログローテート処理はcronを使って自動実行されています。 cronは /etc/crontab ファイルに設定されているとおり、 毎日4時02分に /etc/cron.daily/ ディレクトリ配下の シェル(bash)を実行します。 その中に logrotate 用のシェルが含まれています。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily ←logrotateはここのタイミングで実行される
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
# ls -l /etc/cron.daily/
合計 76
-rwxr-xr-x 1 root root 379 12月 18 2006 0anacron
lrwxrwxrwx 1 root root 39 7月 23 23:56 0logwatch -> /usr/share/logwatch/scripts/logwatch.pl
-rwxr-xr-x 1 root root 118 1月 19 2012 cups
-rwxr-xr-x 1 root root 180 5月 28 2012 logrotate ←logrotate用シェル
-rwxr-xr-x 1 root root 418 4月 17 2012 makewhatis.cron
-rwxr-xr-x 1 root root 137 3月 18 2009 mlocate.cron
-rwxr-xr-x 1 root root 2181 6月 21 2006 prelink
-rwxr-xr-x 1 root root 256 10月 24 2012 rhsmd
-rwxr-xr-x 1 root root 296 8月 1 2012 rpm
-rwxr-xr-x 1 root root 354 8月 7 2010 tmpwatch
logrotateシェルの中でlogrotateコマンドが実行されています。 設定ファイルは実行されるときに読み込まれます。
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf ←logrotateコマンド
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
上記のようにログローテート処理はcronで毎日実行されます。 ただし、実際にファイルがローテートされるのはローテート対象の設定(/etc/logrotate.d/) によりますので、全ファイルが毎日ローテートされるわけではありません。
シスログを例にすると、weeklyでローテートするように設定されています。 logrotateコマンドが実行されると、ファイル毎に前回ローテートされた日付がチェックされ、 そこから1週間以上経過していた場合にのみローテートされます。 どのファイルをいつローテートしたかは /var/lib/logrotate.status ファイルに記録されています。
logrotate state -- version 2
"/var/log/acpid" 2013-7-24
"/var/log/conman/*" 2013-7-24
"/var/log/cups/access_log" 2013-7-28
"/var/log/cups/error_log" 2013-8-4
"/var/log/iscsiuio.log" 2013-7-24
"/var/log/mgetty.log.tty[^.]" 2013-7-24
"/var/log/mgetty.log.tty[^.][^.]" 2013-7-24
"/var/log/mgetty.log.tty[^.][^.][^.]" 2013-7-24
"/var/log/mgetty.log.tty[^.][^.][^.][^.]" 2013-7-24
"/var/log/mgetty.log.tty[^.][^.][^.][^.][^.]" 2013-7-24
"/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.]" 2013-7-24
"/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.][^.]" 2013-7-24
"/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.][^.][^.]" 2013-7-24
"/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.][^.][^.][^.]" 2013-7-24
"/var/log/mgetty.log.tty[^.][^.][^.][^.][^.][^.][^.][^.][^.][^.]" 2013-7-24
"/var/log/mgetty.log.unknown" 2013-7-24
"/var/log/mgetty.callback" 2013-7-24
"/var/log/ppp/connect-errors" 2013-7-24
"/var/account/pacct" 2013-7-24
"/var/log/rpmpkgs" 2013-8-4
"/var/log/rhsm/rhsm.log" 2013-8-4
"/var/log/rhsm/rhsmcertd.log" 2013-8-4
"/var/log/messages" 2013-8-4 ←messagesは前回2013年8月4日にローテートされた
"/var/log/secure" 2013-8-4
"/var/log/maillog" 2013-8-4
"/var/log/spooler" 2013-8-4
"/var/log/boot.log" 2013-8-4
"/var/log/cron" 2013-8-4
"/var/log/up2date" 2013-7-24
"/var/log/wpa_supplicant.log" 2013-7-24
"/var/log/yum.log" 2013-7-24
"/var/log/wtmp" 2013-7-24
"/var/log/btmp" 2013-7-24
上記の状態では、8月11日以降にlogrotateが実行されると messagesはローテートされます。
なお、このファイル内の日付を書き換えると、 前回ローテートした日にちを偽ることができます。 messagesの行を以下のように書き換えます。
※ファイルの該当箇所を変更※ "/var/log/messages" 2013-8-4 ←messagesは前回2013年8月4日にローテートされた ↓変更 "/var/log/messages" 2013-8-3 ←messagesは前回2013年8月3日にローテートされたことに偽る
するとmessagesは前回2013年8月2日にローテートされたことになるので、 1週間後の8月9日に以降にlogrotateコマンドが実行されるとファイルがローテートされます。
動作テスト
ローテートの設定をした後、しばらくサーバを運用した後でmessagesファイルを確認します。 以下のように『ファイル名.1』『ファイル名.2』のようなファイルが作成されています。 このファイルに付与された数字は○世代前を表します。 数が大きいほど古いファイル、小さいほど新しいファイルとなります。
messages.1 のファイルは上の説明で「前回ローテートした日にちを偽って」 ローテーションを実行したときのものです。紛らわしいですがご注意ください。
# ls /var/log/messages* -rw------- 1 root root 51 8月 10 16:42 /var/log/messages -rw------- 1 root root 87627 8月 10 16:03 /var/log/messages.1 ←前回ローテートされたファイル -rw------- 1 root root 131129 8月 4 21:04 /var/log/messages.2 ←前々回ローテートされたファイル -rw------- 1 root root 174276 7月 28 04:02 /var/log/messages.3 ←前々前回ローテートされたファイル
なお、通常停止していて必要なときだけ立ち上げるようなサーバの場合、 ローテーションタイミングが綺麗に1週間毎にならないケースがあります。