カーネルやその他のプログラムが出力するログはハードディスク上のログファイルに書き込まれていきますが、そのままの状態では、ログファイルのサイズが肥大化し、ハードディスクの容量を圧迫してしまいます。これを回避するために Turbolinux 10 Server では logrotate と呼ばれるプログラムを実行し、定期的にログファイルのローテーションを行っています。logrotate は、以下の図のように定期的に新しいログファイルを作成し、古いログファイルをリネームしながらローテーションを実行します。

例えば、/var/log/messages ファイルは /var/log/messages.1.gz にリネームされ、その後のログは新規に作成された /var/log/messages に記録されるようになります。そして、次の週には /var/log/messages.1.gz は /var/log/messages.2.gz に、/var/log/messages は /var/log/messages.1.gz にリネームされます。また、Turbolinux 10 Server の初期設定では、/var/log/messages は 4 世代まで保存される設定になっており、/var/log/messages.4.gz は /var/log/messages.5.gz にローテーションされずに削除されます。/var/log/ ディレクトリを確認すると、以下のように 1 週間毎にローテーションされていることが分かります。
$ ls -l /var/log/messages* -rw------- 1 root root 10086 Sep 27 15:41 /var/log/messages -rw------- 1 root root 19044 Sep 26 04:02 /var/log/messages.1.gz -rw------- 1 root root 23394 Sep 19 04:02 /var/log/messages.2.gz -rw------- 1 root root 13850 Sep 12 04:02 /var/log/messages.3.gz -rw------- 1 root root 12338 Sep 5 04:02 /var/log/messages.4.gz |
この処理は、logrotate と cron が連動することにより実行されています。ログファイルをローテーションする役割を担っているのは logrotate ですが、定期的に logrotate を実行するのは cron です。cron については、第27章 を参照してください。Turbolinux 10 Server では、以下のように /etc/cron.daily/logrotate で、毎日 logrotate コマンドを実行するように設定されています。
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0 |
どれくらいの周期で何世代までログファイルを保存するかといったローテーションの設定は、logrotate の設定ファイルである /etc/logrotate.conf と /etc/logrotate.d/ ディレクトリ以下の設定ファイルに記述されています。/etc/logrotate.conf は logrotate の全般的な設定を行うための設定ファイルです。各ログファイルをローテーションするための設定は、/etc/logrotate.d/ ディレクトリ以下の設定ファイルに記述されています。
![]() | /var/lib/logrotate.status には、前回ローテーションした日付が以下のように記録されています。logrotate はこの日付を参照し、ローテーションを実行するかどうかを判断します。
|
Turbolinux 10 Server の /etc/logrotate.conf の内容は以下の通りです。
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# size limit to 100M, syslogd crashed with larger file > 2G.
size 100M
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
# system-specific logs may be also be configured here. |
設定されているオプションの意味を以下に示します。
ログファイルを週単位でローテーションする指定です。この他に、monthly(毎月)や daily(毎日)を指定できます。
ログファイルを何世代までバックアップするかを指定します。ここでは、4 が指定されていますので、4 世代分のログファイルを保存します。
ローテーション後すぐに同名の新規ログファイルを作成するための指定です。(後述する postrotate よりも先に行われます)
ローテーションしたログファイルを gzip で圧縮するための指定です。
指定されたファイル、またはディレクトリ以下のファイルを設定ファイルとして読み込みます。ここでは、/etc/logrotate.d が指定されていますので、このディレクトリのファイルを設定ファイルとして include しています。
ログファイルのサイズがここで指定したサイズに達すると、ログのローテーションを行います。
/var/log/tmp 以下 { } で括られた箇所には、/var/log/tmp ファイルのローテーション設定が記述されています。ここで記述した設定は、全般設定を上書きします。
その他、logrotate の設定ファイルに指定可能な主なオプションを以下に示します。他にも多くのオプションがありますので、詳細は man logrotate を参照してください。
ローテーション後に新規ログファイルを作成します。create に続けて、ファイルのパーミッション、ユーザ名、グループ名をスペースで区切り、指定することもできます。
ログファイルが空の場合でもローテーションを行います。
ログファイルが存在しなくてもエラーを出力しない。
ローテーションされたログファイルを圧縮しない。
新規ログファイルを作成しない。
ログファイルが存在しない場合はエラーを出力します。
ローテーションするログファイルと同じディレクトリにローテーションしたログファイルを保存します。
ログファイルが空の場合はローテーションしない。
指定したディレクトリにローテーションしたログファイルを格納します。
postrotate と endscript の間に記述したコマンドをローテーション後に実行します。
postrotate と endscript の間に記述したコマンドをローテーション前に実行する。
複数指定したログファイルに対して postrotate または prerotate で記述したコマンドを実行する。
/etc/logrotate.conf ファイルには、logrotate 全体のデフォルト設定が記述されており、各ログファイルのローテーション設定は /etc/logrotate.d ディレクトリ内の設定ファイルで行います。/etc/logrotate.conf で記述した設定は、個々のログファイルでは省略することができますので、設定が異なるときだけ記述します。/etc/logrotate.d/ ディレクトリには、以下のような設定ファイルが存在します。
# ls /etc/logrotate.d/ cron cups* httpd mysql proftpd radiusd rpm samba snmpd squid syslog tux |
これら、/etc/logrotate.d ディレクトリ内の設定ファイルは、以下の書式で記述されています。
logfile [logfile ...]{
設定値
...
} |
例えば、/etc/logrotate.d/syslog ファイルの内容を以下に示します。このファイルは、syslogd が出力するログファイルをローテーションするための設定ファイルです。
/var/log/messages {
postrotate
/usr/bin/killall -HUP syslogd
endscript
}
/var/log/secure {
postrotate
/usr/bin/killall -HUP syslogd
endscript
}
/var/log/maillog {
postrotate
/usr/bin/killall -HUP syslogd
endscript
}
/var/log/spooler {
postrotate
/usr/bin/killall -HUP syslogd
endscript
}
/var/log/boot.log {
postrotate
/usr/bin/killall -HUP syslogd
endscript
} |
このように、/etc/syslog.conf で出力先に指定されているログファイルをローテーションするための設定が記述されています。この例では、全般設定を上書きするような設定は記述されていませんので、/etc/logrotate.conf の記述に従いログファイルはローテーションされます。ただし、以下の設定が追記されていることに注意してください。
postrotate /usr/bin/killall -HUP syslogd endscript |
postrotate と endscript の間には、ローテーション後に実行したいコマンドを記述することができます。したがって、/etc/logrotate.d/syslog では、ローテーション後に HUP シグナルを送り、syslogd を再起動しています。これは、ローテーション後に create によって作成された新規ログファイルに syslogd が正常にログを書き込めるようにするための設定です。syslogd の動作中にログファイルのローテーションを行うと syslogd は出力するログファイルを見失ってしまうため、syslogd を再起動して、この問題を回避しています。他の設定ファイルでも同様にデーモンを再起動するための設定が記述されています。