ログローテーション(logrotate)とは...
各種ログファイルは放置しておくと時間とともに肥大化します。この問題を解決するのがログローテーションです。
ログローテーションは、例えばlogというログファイルの名前をlog1 log2 log3…というように定期的に回してバックアップします。
ローテーション数を4にしたのであれば定期的にlog4のログはlog3に上書きされ、log3のログはlog2に上書きされ、log2のログはlog1に上書きされ
log1のログはlogに上書きされます。そして新たな空のログファイルlogが生成されます。一週間間隔でローテーションするのであれば
ログファイルは1週間ログデータが記録されるごとに空になり、4週間分のログファイルがバックアップされていることになります。
logrotateはcronによって定期的に実行されています。
#ls -l /etc/cron.daily/logrotate
-rwxr-xr-x 1 root root 180 8月 2 2003 /etc/cron.daily/logrotate
#vi /etc/cron.daily/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です。
logrotateの設定ファイル/etc/logrotate.confのデフォルトは以下のようになっている。
#cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly ←毎週ログローテーションする。
# keep 4 weeks worth of backlogs
rotate 4 ←4回ローテーションする。この場合は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 ←/etc/logrotate.d以下の設定ファイルを読み込む。
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp { ←/var/log/wtmpファイルのローテーション設定である。
monthly
create 0664 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
この設定ファイルでは全体のデフォルトのローテーション設定を行い個々のログファイルのローテーション設定は/etc/logrotate.dディレクトリ内の各設定ファイルに記述します。
したがってここで記述した設定は個々のログファイルの設定で省略することができます。設定が異なる場合だけ記述します。例えばあるログファイルは毎日ローテーションしたいのであれば
そのログファイルの設定ファイルに daily と記述します。そうすればこちらの設定が優先されますので毎日ローテーションされます。
#ls -l /etc/logrotate.d
-rw-r--r-- 1 root root 61 7月 18 2003 rpm
-rw-r--r-- 1 root root 228 6月 6 2003 syslog
-rw-r--r-- 1 root root 32 2月 23 2001 up2date
-rw-r--r-- 1 root root 89 10月 29 23:54 yum
/etc/logrotate.dディレクトリ内の個々のログファイルの設定ファイルのフォーマットは以下のようになっている。
ログファイル名 [ ログファイル名 …]{
設定値
・・・
}
設定値には以下のようなものがある。
| 設定値 |
説明 |
| compress |
ローテーションされたログをgzipで圧縮する。 |
| create [パーミッション] [ユーザ名] [グループ名] |
ローテーション後に新たな空のログファイルを作成します。ファイルのパーミッション、ユーザ名、グループ名を指定できます。 |
| daily |
毎日ログローテーションする。 |
| ifempty |
ログファイルが空でもローテーションする。 |
| missingok |
ログファイルが存在しなくてもエラーを出さない。 |
| monthly |
毎月ログローテーションする。 |
| nocompress |
ローテーションされたログを圧縮しない。 |
| nocreate |
新たな空のログファイルを作成しない。 |
| nomissingok |
ログファイルが存在しない場合エラーを出す。 |
| noolddir |
ローテーション対象のログと同じディレクトリにローテーションされたログを格納する。 |
| notifempty |
ログファイルが空ならローテーションしない。 |
| olddir ディレクトリ名 |
指定したディレクトリ内にローテーションされたログを格納する。 |
| postrotate - endscript |
postrotateとendscriptの間に記述されたコマンドをログローテーション後に実行する。 |
| prerotate - endscript |
postrotateとendscriptの間に記述されたコマンドをログローテーション前に実行する。 |
| rotate 回数 |
指定した回数だけローテーションする。 |
| size ファイルサイズ |
ログファイルが指定したファイルサイズ以上であればローテーションする。 |
| sharedscripts |
複数指定したログファイルに対してpostrotateまたはprerotateで記述されたコマンドを実行する。 |
| weekly |
毎週ログローテーションする。 |
以下は/var/log/rpmpkgsログファイルのローテーション設定である。
#cat /etc/logrotate.d/rpm
/var/log/rpmpkgs {
weekly ←毎週ログローテーションする。
notifempty ←ログファイルが空ならローテーションしない。
missingok ←ログファイルが存在しなくてもエラーを出さない。
}
最後にApacheのログファイルをローテーションする設定を紹介します。
#vi /etc/logrotate.d/apache ←何のログファイルの設定ファイルか分かるファイル名にします。
/usr/local/apache/logs/access_log /usr/local/apache/logs/error_log {
missingok
sharedscripts ←複数のログファイルを指定しているので記述する必要があります。
postrotate
/bin/kill -HUP `cat /usr/local/apache/logs/httpd.pid`
endscript
}
ログローテーション後にApacheを再起動しています。再起動しないとApacheは新たに作成されたログファイルを見つけることができないのでロギングすることができません。