ログローテートツール「logrotate」を使いこなしたい

 ログファイルの扱いはシステム管理の中でも重要な物の1つだ。「ログファイル」とひと口にいっても幾つかの種類があり,システムログ(messages),Apacheのアクセスログ(access_log),Cron,ftp,Sambaなどが挙げられる。日ごろからそれぞれの使用頻度を監視して,ログファイル容量が肥大化し過ぎないよう管理しなければならない。

 このような状況が考慮され,Linuxディストリビューションのほとんどには「logrotate」と呼ばれるログを自動的に回す(ローテート,詳細後述)ツールがRPMパッケージで用意されている。このツールを使いこなすことができれば,Apacheの場合「Apacheのログファイルを定期的に分割させたい〜rotatelogs編〜」や「Apacheのログファイルの肥大化を回避させたい」Tipsで紹介したような対処が不要になる。

 logrotateがRPMでインストールされているかどうかは,次のようにして調べればよい。新たにインストールしたい場合には,rpmfindから探すとよいだろう。

# rpm -qa|grep logrotate
logrotate-3.3.2-2

 前述した「ログを回す」という表現について補足しておこう。logrotateがログを世代管理させる意味は,管理ツールなどで扱いやすいよう容量の肥大化を回避させることにある。数百MBものログファイルになってしまうと,ログ解析する場合にCPUやメモリに必要以上の負担がかかってしまう。そこで,特定の日時でそれまでのログをバックアップファイルとして切り替えるわけだ。

 実際のログ保存状況を見てみよう。ここでの例は,8月5日までは週ごとにローテートしていたが,それ以降は,月ごとに変更した場合の状況だ。

# ls -l /var/log/
..............
-rw------- 1 root root 16196928 Aug 22 07:28 messages
-rw------- 1 root root 2948465 Aug5 04:01 messages.1
-rw------- 1 root root 6228369 Jul 29 04:01 messages.2
-rw------- 1 root root 5372530 Jul 22 04:01 messages.3
-rw------- 1 root root 6861361 Jul 15 04:01 messages.4
-rw------- 1 root root 2470013 Jul8 04:01 messages.5
..............

 いちばん上に見られるファイルが,メインのシステムログファイル(messages)。logrotateが動作していないと,このファイルが肥大化の一途をたどってしまう。後述する設定通りに動作していれば,ファイル名の末尾に「.1」などと数字が付加されて世代管理されるのだ。幾つまでの世代数を保存するかは,後述する方法で変更できる。

logrotate自体の実行スケジュールはCronで設定されている

 どのように特定日時で切り替えが行われるのだろうか。次のようにcronデーモン設定を確認すればよい。

# cat /etc/cron.daily/[Tab][Tab]
logrotate makewhatis.cron slocate.cron tmpwatch
# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf

 ここで分かるのは,cronデーモンによって毎日実行されるディレクトリ下「cron.daily」に,logrotateの名でスクリプトファイルが存在していることだ。また,ファイル内容からは「/usr/sbin/logrotate」バイナリが「/etc/logrotate.conf」設定ファイルに沿って実行されることを意味する。logrotate.confの内容を見てみよう。

logrotare.confファイルで基本設定を行う

# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 50
mail root

# send errors to root
errors root

# 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

# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}

 最初に注目したいのは,イエローで強調した「weekly」指定だ。ここでの文字列によって「基本」スケジュールが定義される。あえて「基本」と強調しているのは,後述の方法でサービスごとの制御もできるためだ。weekly(毎週)のほかに,daily(毎日),monthly(毎月)などが一般的である。

 次に,グリーンで強調した個所を見てほしい。これは「/etc/logrotate.d」ディレクトリ下の設定ファイルを読み込むという指定だ。上記の「/etc/logrotate.conf」ファイル内にそれぞれのログファイルの設定を記述することもできる。しかし,サービスごとに設定ファイルを分けた方が分かりやすいとの判断から,標準設定ではディレクトリ下を参照するようになっている。

/etc/logrotate.d/下にサービスごとの設定ファイルを用意する

 「/etc/logrotate.d」ディレクトリ下を見てみよう。環境によって異なるが,次のような設定ファイルが見られるはずだ。たとえばApacheをRPMでインストールしていない場合,apacheファイルが見当たらないはずだ。そのような場合には,自ら「ソースコンパイルのApacheでアクセスログをローテートさせたい」Tipsのように作成すればよい。

# ls /etc/logrotate.d
apachecronftpdlinuxconfsambasysloguucp

 ここでは例として,システムログ(syslog)の設定内容を見てみよう。

# cat /etc/logrotate.d/syslog
/var/log/messages {
rotate 50
weekly

postrotate
/usr/bin/killall -HUP syslogd
endscript
}

 〜以下略〜

 ここで注目したいのは,イエローで強調している2行だ。「rotate 50」は50世代のバックアップを行い,「weekly」はlogrotate.conf同様ローテートを行う間隔を指定している。この2行を書き換えることで個々のサービスごとに指定ができる。

スケジュールのコントロールには注意しよう

 ここで注意しておきたいのは,「/etc/logrotate.d」下のファイルで「daily」と指定してもlogrotate.conf内で「weekly」と指定されていると「daily」実行されない点だ。個々のサービスでローテート間隔を変えたい場合には,logrotate.confでは「daily」にしておいて,「/etc/logrotate.d」下の設定ファイルそれぞれで定義しておく必要がある。

 これらの手順によって,cronでlogrotate.confの「daily」が読み込まれ,「/etc/logrotate.d」ディレクトリ下の設定スクリプトも毎日参照されつつ,それぞれのサービスごとのローテート間隔で実行される。もちろんすべて「weekly」指定でよいならば,上記の2行は不要だ。