ほとんどのログファイルは、/var/log ディレクトリに入ってる。というか暗黙の了解のようなもので、多くのプログラムはこのディレクトリにログファイルを出力するようにしているようだ。実際、同じディレクトリにログファイルを溜め込んだ方が後でログを探す手間が省ける。
例えば、下記のようなオプションをつけてntpdを稼動させると、 /var/log/ntpd.log というログファイルが記録される。
/usr/sbin/ntpd -l /var/log/ntpd.log (他のオプションは表記省略)
このようなログファイルは、放置すればするほどファイルサイズが増えていくばかりだ。 ntpd.log は1年放置してもせいぜい1MB程度かもしれないが、 他にログ取得しているプログラムもあるはずで、 それらが溜まりに溜まって、いずれハードディスクを圧迫する時がくるかもしれない。
ログ・ローテーションは、一定期間ごとに、その時点のログファイルを数字付きのファイル名にリネームする作業だ。 そして指定しておいた世代数まで保管して、それよりも古いログファイルは削除する。
それでは、/var/log ディレクトリの中身を見てみることにする。
# cd /var/log # ls -al | more
するとログファイルのリストがだらだら~っと表示される。
-rw------- 1 root wheel 13880 Feb 14 15:33 cron -rw------- 1 root wheel 5561 Feb 14 07:00 cron.0.bz2 -rw------- 1 root wheel 5305 Feb 11 18:00 cron.1.bz2 -rw------- 1 root wheel 5711 Feb 9 05:00 cron.2.bz2 -rw------- 1 root wheel 5341 Feb 6 16:00 cron.3.bz2 -rw-r--r-- 1 root wheel 28056 Feb 14 15:02 lastlog -rw-r--r-- 1 root wheel 362379 Feb 12 14:02 ntpd.log
あら? ローテーションの設定をしたつもりが無いのに、 ファイル名の後ろに「数字.bz2」という拡張子がついたファイルがあるよ? つーことは、もう、ローテーションされてるんだぁ! あれ、でも、ローテーションされてないファイルもあるべ???
実は、FreeBSD をインストールして時点でnewsyslogというプログラムがインストールされていて、 /var/log/cron や /var/log/maillog がローテーションされるようになっている。
ここで脱線して、newsyslog を探ってみよう。
1. FreeBSD 起動時にソレが実行されてるかな?と推測したら、/etc/default/rc.conf を見てみよう。
# more /etc/default/rc.conf
起動時にnewsyslogが動いているようだ。
newsyslog_enable="YES" # Run newsyslog at startup. newsyslog_flags="-CN" # Newsyslog flags to create marked files
2. 一定時間ごとにソレが実行されてるかな?と推測したら、/etc/crontab を見てみよう。
# more /etc/crontab
newsyslog が毎時0分に動いているようだ。
# #minute hour mday month wday who command # # Rotate log files every hour, if necessary. 0 * * * * root newsyslog
3. 設定ファイルはどれかな?と思ったら、ファイル検索だ。
# find / -name "newsyslog*" -print
なんか、newsyslog.conf ってのがあるなぁ。
/etc/rc.d/newsyslog /etc/newsyslog.conf /usr/sbin/newsyslog
4. じゃ、中みてみっか。
# more /etc/newsyslog.conf
あー、ここに定義されているファイルがローテーションしてるんだ~。
logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/all.log 600 7 * @T00 J /var/log/amd.log 644 7 100 * J /var/log/auth.log 600 7 100 * JC /var/log/console.log 600 5 100 * J /var/log/cron 600 3 100 * JC /var/log/daily.log 640 7 * @T00 JN /var/log/debug.log 600 7 100 * JC /var/log/kerberos.log 600 7 100 * J /var/log/lpd-errs 644 7 100 * JC /var/log/maillog 640 7 * @T00 JC /var/log/messages 644 5 100 * JC /var/log/monthly.log 640 12 * $M1D0 JN /var/log/pflog 600 3 100 * JB /var/run/pflogd.pid /var/log/ppp.log root:network 640 3 100 * JC /var/log/security 600 10 100 * JC /var/log/sendmail.st 640 10 * 168 B /var/log/slip.log root:network 640 3 100 * JC /var/log/weekly.log 640 5 1 $W6D0 JN /var/log/wtmp 644 3 * @01T05 B /var/log/xferlog 600 7 100 * JC
つまり、newsyslog.confにローテーションさせたいログ・ファイルを追加すればよいのだ。
ここでは、ntpd.logをローテーションする設定をしてみる。
まず、ntpd.log の現状を確認。
%su Password: # ls -al /var/log | grep ntpd -rw-r--r-- 1 root wheel 362379 Feb 12 14:02 ntpd.log
続いて、/etc/newsyslog.conf の末尾に追記するため、viで編集する。
# vi /etc/newsyslog.conf
追記する内容は /var/log/cron の設定を見習って次のようにしてみる。
logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/ntpd.log 644 7 100 * JC
この設定は、/var/log/ntpd.log を、パーミッション644で、 0~7世代まで、100KB以上の場合に、時間に関係なく、bzip2圧縮(J)をして、新しくntpd.log を作る(C)するというもの。その他の説明は、# man newsyslog.conf を参照すること。
そして、newsyslogを実行して、ファイルのリストを確認してみる。
# newsyslog # ls -al /var/log | grep ntpd -rw-r--r-- 1 root wheel 77 Feb 14 17:00 ntpd.log -rw-r--r-- 1 root wheel 23627 Feb 14 17:00 ntpd.log.0.bz2
お・・・なんか出来てる。