OSS Fan ~OSSでLinuxサーバ構築~

作成日: 2013/08/10
更新日: 2013/10/30

OSSでLinuxサーバ構築

Linuxのシスログ(messages)の保存期間を3ヶ月間に変更する

トップページOSSでLinuxサーバ構築 > 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
ファイル名:/etc/logrotate.d/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 用のシェルが含まれています。

ファイル名:/etc/crontab
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コマンドが実行されています。 設定ファイルは実行されるときに読み込まれます。

ファイル名:/etc/cron.daily/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 ファイルに記録されています。

ファイル名:/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/lib/logrotate.status
※ファイルの該当箇所を変更※
"/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週間毎にならないケースがあります。

プロフィール

らのっち

損害保険会社のIT企画部に勤務するSEです。OSSを勉強中です。

<所属>
日本PostgreSQLユーザ会とくしまOSS普及協議会


第000414号