B.タイマー起動による自動ローテーション
決まった時間になるとログファイルのローテーションが自動的におこなわれるように設定してみよう。
1.cronの自動起動
/etc/rc.localファイルの末尾に次の一行を追加する。
sudo /etc/init.d/cron start
端末からviエディタで編集するのが簡単だ。
$ su
# vi /etc/rc.local
i ・・・挿入モード
[Esc] ・・・コマンドモード
:wq ・・・上書きして終了
cronというのは、プログラムのスケジューラだ。cronを起動しておくと、毎時、毎日、毎週、毎月の特定の時間に、特定のプログラムが実行される。
2.crontabの設定
cronのスケジュールは、/etc/crontabファイルに書かれている。KNOPPIX6.2のデフォルトでは、次のようになっていると思う。
# m h dom mon dow user command
17 * * * * root …… /etc/cron.hourly
25 6 * * * root …… /etc/cron.daily
47 6 * * 7 root …… /etc/cron.weekly
52 6 1 * * root …… /etc/cron.monthly
毎日実行されるcron.dailyのプログラムは6時25分、毎週実行されるcron.weeklyは日曜日の6時47分に設定されている。この設定は、viなどでcrontabを編集すれば変更することができる。
わたしはcron.hourlyの行頭に#マークをつけて、毎時のスケジュールを無効にしている。それは、本末転倒のようだが、ログファイルを見やすくするためだ。
3.cron.dailyとcron.weekly
/etc/cron.dailyおよび/etc/cron.weeklyというディレクトリに、それぞれsysklogdというファイルがある。syslogdのログファイルのローテーションは、これら2つのファイルの設定にもとづいて実行される。
/etc/cron.daily/sysklogdを開くと、次のような記述がある。
for LOG in $logs
do
if [ -s $LOG ]; then
savelog -g adm -m 640 -u root -c 7 $LOG >/dev/null
fi
done
savelogというのが、ログファイルのローテーションを行うコマンドだ。$LOG >/dev/nullという部分がさっぱり理解できないが、-g,-m,-u,-cのオプションについては、savelogのマニュアルページに解説がある。
$ man savelog
マニュアルページには、最新のログファイルと2番目(file.0)以外は圧縮されるということも書かれている。
gzipで圧縮されてgzという拡張子がついたログファイルは、GNOMEアプリケーションの「ログ・ビューア」なら、ふつうに開くことができる。
端末では、lessなどのかわりにzmoreコマンドを使えば表示できる。
コンソールモードでは、zmoreだとファイルの一部しか表示されないが、次のようにパイプでzmoreとlessを組み合わせることでうまく表示できた。
/var/log# zmore file.*.gz | less
savelogの-cオプションは、古いログファイルをいくつ保存するか指定する。デフォルトでは7日分だ。編集して数字を大きくすることもできる。
/etc/cron.weekly/sysklogdの記述もほとんど同じだ。デフォルトで保存されるログは4週間分なので、編集して数字を変えることもできる。
4.syslogd-listfiles
それぞれのログファイルのローテーションが、cron.dailyから行われるのかcron.weeklyから行われるのかということは、syslogd-listfilesというコマンドで確認できる。
$ syslogd-listfiles
/var/log/syslog
$ syslogd-listfiles –weekly
/var/log/usr.log
/var/log/daemon.log
/var/log/messages
/var/log/debug
/var/log/mail.log
/var/log/auth.log
/var/log/lpr.log
/var/log/kern.log
/var/log/cron.log
syslogd-listfilesのオプションについての解説は、マニュアルページに書かれている。
$ man syslogd-listfiles
オプションなしで表示された/var/log/syslogは、cron.dailyからローテーションが実行される。–weeklyオプション(ハイフン2つ)で表示されたそれ以外のログファイルは、cron.weeklyから実行される。
この設定は、cron.weeklyファイルの次の記述に関係している。
logs=$(syslogd-listfiles –weekly)
そこで、たとえば–weeklyオプションの部分を変更することで、すべてのログファイルのローテーションをcron.weeklyから実行することもできそうだ。それには、–weeklyを-aに変えればいいはずだ。さらに、/etc/cron.daily/sysklogdの設定は無効にした方がいいだろう。
syslogd-listfilesのdailyとweeklyの区分を変更する方法については、どうしたらいいのかわからない。
C.手動起動による自動ローテーション
savelogとsyslogd-listfilesのしくみがわかれば、cronなしでもログファイルのローテーションを実行することができる。
ログファイルのローテーション目的以外にcronを起動しておく理由がなければ、/etc/rc.localのcronの起動設定は無効にしてしまおう。cronのスケジュールが実行されると、わたしのパソコンなどは20分近くフリーズに近い状態が続いてしまう。
cronの起動設定を無効にするには、viなどのroot権限で/etc/rc.localファイルを開き、cronの行の頭に次のように#マークをつける。
# sudo /etc/init.d/cron start
そして、適当なタイミングでcron.dailyとcron.weeklyのsysklogdをそれぞれ手動で実行する。
cron.dailyからローテーションが実行されるsyslogの場合は、次の通り。
# /etc/cron.daily/sysklogd
syslog以外のログファイルについては、次の通り。
# /etc/cron.weekly/sysklogd
前回ためしたAの方法は勘弁してもらうとして、BとCの方法には一長一短がある*。もうしばらく試行錯誤してみよう。
* Cの方法はかなりよさそうだが、欠点もある。最大の問題は、/var/logディレクトリにあるsyslogdによるもの以外のログファイルのローテーションに対応していないことだ。それらは空だったり急に肥大化することのなさそうなファイルだが、時々チェックしなければならない。よくよく考えてみれば、これはむしろ望ましいことかもしれない。面倒くさいけれど。
今回助けられたDebianのお告げ
Debianのsyslogのローテーションがlogrotate*の設定で行われるというのは、完全に間違っています。
Debian syslog rotation is not controlled by logrotate at all, please don’t mislead the OP when you’re not sure with it. You might making him going to the wrong direction in solving this and waste a lot of his time.
(by sloganyart 07-31-2008 “How to change Debian log rotation of syslog and daemon.log” linuxquestions.org)
* /etc/logrotate.conf, /etc/logrotate.d
the OPというのは誰なんだろう。himというからにはどうやら男のようだ。危ないところだったらしい。
Tags: knoppix, knoppix6.2, syslogd
Debianって/etc/logrotate.d/ディレクトリはないんだっけ?
いつもはここに(例えば)nginxというファイルを置いて
/usr/local/nginx/logs/*log {
missingok
notifempty
compress
compresscms /usr/bin/bzip2
compressext .bz2
delaycompress
}
みたいな内容で勝手にローテートしてもらっている。