Gentoo Linuxでは各種アプリケーションが出力するログは /var/log/ ディレクトリの 下に出力されます。このディレクトリの中を眺めていると,Apacheやcron 等のログは,サイズが かなり大きくなっていることに気づきました。
Syslog経由で出力されるログ(例えば message.log等)は,cronにより実行される
/etc/cron.daily/syslog により,ローテーションされていました。ローテーションとは
一定期間ごとにログを別ファイルにバックアップとして保存していき,バックアップされたログファイルも
一定期間ごとに破棄することで,ディスク容量の圧迫を防ぐ仕組みです。
|
|
|
ログがローテーションされる様子 |
Syslog経由ではなく,独自にログを出力しているApache等は,ログをローテーションさせて
ログの肥大化を防ぐ必要があります。そのためのツールとしてLogrotateを導入します。
$ sudo emerge logrotateインストールされたlogrotateのバージョンは 3.8.0 でした。
#全ログに共通な設定をしています。
#毎週日曜日にローテーションします。
weekly
#4週分のログを保存します。
rotate 4
#ローテーション後同名のファイルを生成します。
create
#ローテーション後にファイルを圧縮します。
compress
#/etc/logrotate.dディレクトリ以下のファイルを
#logrotateの設定ファイルとします
include /etc/logrotate.d
#ログファイルが空の場合はrotateしません
notifempty
#mailを発信しません
nomail
# log出力先のディレクトリを同じとします。
noolddir
#logrotateさせる対象ファイルの設定をしています。
#ここで記述された設定は,上記の全ログ共通の設定を上書きします。
/var/log/wtmp {
#毎月ローテーションします。
monthly
#ローテーションされたファイルの所有権を設定します。
create 0664 root utmp
#1月分のログを保存します。
rotate 1
}
weekly
毎週ローテーションします(monthly,weekly,dailyの指定が可能です。)
・monthly
基本的にには,毎月1日にローテーションが行われます。
前回ローテーションされてからある月の1日を過ぎてローテーションされていなければローテーションを行います。
・weekly
基本的にには,毎週日曜日にローテーションが行われます。
前回ローテーションされてから日曜日を過ぎてローテーションされていなければローテーションを行います。
・daily
前回ローテーションされてから,1日が経過していれば,ローテーションを行います。
logrotateは /var/lib/logrotate.status に記述されている日時により,
前回ローテーションを行った日を判断します。
/var/log/wtmp {
/var/log/wtmp の設定をします。
ここで設定された内容は,全ログ共通の設定を上書きします。
monthly
毎月ローテーションします。
全ログ共通の設定では weekly と設定されていましたが, 各ログ毎の設定が優先されます。
create 0664 root utmp
ローテーション後すぐ作成されるファイルの
パーミッションを0644、所有者をroot、グループをutmpとします。
/etc/logrotate.confでinclude /etc/logrotate.d が設定されていると、/etc/logrotate.d 配下の
ファイルでも logrotateの設定を行うことができます。
各ログの設定を、/etc/logrotate.dディレクトリ以下にファイルを作成し,そのファイルに設定を記述します。
ここでの設定内容も全ログ共通の設定を上書きします。
/etc/logrotate.d/apache というファイルを作成し以下のようにapacheのログの設定を行いました。
/var/log/apache2/access_log_hoge {
#対象のファイルが存在しなくても、エラーとしません。
missingok
#毎月ローテーションします。
monthly
postrotate
/usr/bin/killall -HUP apache2
endscript
}
/var/log/apache2/access_log_hoge {
どのログファイルについての設定かを記述します。
例では /var/log/apache2/access_log_hoge についての設定を行っています。
postrotate
/usr/bin/killall -HUP apache2
endscript
postrotateからendscriptまでの処理をローテーション終了後に実行します。
上記の場合、 postrotate と endscript の間にある
/usr/bin/killall -HUP apache2 がローテーション後に
実行されます。
これはログを吐いているプロセスが、ログファイルを見失
うのを防ぐため、HUPシグナルを送って、設定を再読み込みさせています。
"/var/log/wtmp" 2004-3-7