HAYAGUI

FreeBSD 4.7 + newsyslog

はじめに

システムに保存したログを、サイズがとてつもなく大きくなることなくローテーションする仕組みを説明します。 FreeBSD 4.7 は、newsyslog というプログラムが使用されています。

FreeBSD の man を参照しました。

仕組み

FreeBSD 4.7のマシンは、あまり動いていないので、家のサーバとして使っている FreeBSD 4.5の /var/log を見ましょう。
> uname -rs
FreeBSD 4.5-RELEASE
> pwd
/var/log
> ls
adduser                 maillog.0.gz            sendmail.st.0
cron                    maillog.1.gz            sendmail.st.1
cron.0.gz               maillog.2.gz            sendmail.st.10
cron.1.gz               maillog.3.gz            sendmail.st.2
cron.2.gz               maillog.4.gz            sendmail.st.3
cron.3.gz               maillog.5.gz            sendmail.st.4
dmesg.today             maillog.6.gz            sendmail.st.5
dmesg.yesterday         maillog.7.gz            sendmail.st.6
httpd-access.log        messages                sendmail.st.7
httpd-error.log         messages.0.gz           sendmail.st.8
lastlog                 messages.1.gz           sendmail.st.9
log.chaco               messages.2.gz           setuid.today
log.jhon                messages.3.gz           slip.log
log.jhon.old            messages.4.gz           snmpd.log
log.mimi                messages.5.gz           userlog
log.nmb                 mount.today             webmin
log.smb                 ppp.log                 wtmp
lpd-errs                security                wtmp.0
maillog                 sendmail.st
このように、0,1,2,.. とローテーションされていることがわかります。

次に newsyslog が起動される仕組み。
/usr/sbin/newsyslog は、cron によって指定された時間に起動されます。 デフォルトは、分が 0 になる時(9:00 とか 14:00)の設定です。

> which newsyslog
/usr/sbin/newsyslog

> cat /etc/crontab
# rotate log files every hour, if necessary
0       *       *       *       *       root    newsyslog
newsyslog は、 /etc/newsyslog.conf の設定内容で動作します。
> cat /etc/newsyslog.conf
# logfilename          [owner:group]    mode count size when [ZJB] [/pid_file] [sig_num]
/var/log/cron                           600  3     100  *     Z
/var/log/amd.log                        644  7     100  *     Z
/var/log/kerberos.log                   600  7     100  *     Z
/var/log/lpd-errs                       644  7     100  *     Z
/var/log/maillog                        644  7     *    @T00  Z
/var/log/sendmail.st                    644  10    *    168   B
/var/log/messages                       644  5     100  *     Z
/var/log/all.log                        600  7     *    @T00  Z
/var/log/slip.log                       600  3     100  *     Z
/var/log/ppp.log                        600  3     100  *     Z
/var/log/security                       600  10    100  *     Z
/var/log/wtmp                           644  3     *    @01T05 B
/var/log/daily.log                      640  7     *    @T00  Z
/var/log/weekly.log                     640  5     1    $W6D0 Z
/var/log/monthly.log                    640  12    *    $M1D0 Z
/var/log/console.log                    600  5     100  *     Z
次のような書式になります。

logfilename [owner:group] mode count size when [ZJB] [/pid_file] [sig_num]
logfilename 保存されているシステムログファイル名。
owner:group 保存ログファイルの所有者とグループ名。オプション
mode 保存ログファイルのパーミッション
count 何回ローテーションするか。
size ログファイルのサイズが size キロバイトに達した時に、ローテーションする指定。 アスタリスク (`*')に設定されていると、サイズは考慮しません。
when ローテーションするタイミングが、インターバル、特定の時刻、もしくは両方の場合を設定できます。 時刻を指定した場合、指定した時刻の 1 時間以内に newsyslog が実行された時だけ、ローテーションします。 インターバル時間を指定した場合、最後のローテーションからその時間が経過した場合に、ローテーションします。 時刻とインターバルの両方が指定された場合は、両方の条件があった時(AND)に、ローテーションします。 タイムゾーンは指定できません。
時刻指定時は、`@' から始まるISO 8601 制限付時刻フォーマットと、 `$' から始まる日・週・月の時刻フォーマットがあります。 ISO 8601 制限付時刻フォーマットの T は、日付T時間のように時間の始まりを意味しますので、 @T00 であれば、日付設定無しで時間が 24:00 の意味。 @01T05 であれば、毎月 01 日の時間が 5:00 の意味。
日・週・月の時刻フォーマットの M は 月、W は週、D は日を意味しますので、 $W6D0 であれば、毎週土曜日の 24:00 の意味。 $M1D0 であれば、毎月1日の 24:00 の意味。

インターバルの場合は、時間を書くだけです。 168 は、168時間という意味です。

アスタリスク (`*')に設定されていると、この項目は考慮しません。

[ZJB] ログ保存時のオプション。Z は、gzip で圧縮する意味。 J は、bzip で圧縮する意味。B は、バイナリの意味。指定しない時は、- を入れることも可能。
[/pid_file] シグナルを送る DaemonのプロセスIDが保存されているファイルへのパス。
[sig_num] シグナルを送る時、どのシグナルを送るかを設定。
先ほどのログディレクトリの cron とmaillog を見てみましょう。
> ls -la cron* maillog*
-rw-------  1 root  wheel  99356   8/23 18:00 cron
-rw-------  1 root  wheel   6494   4/14 00:00 cron.0.gz
-rw-------  1 root  wheel   6560   3/ 2 23:00 cron.1.gz
-rw-------  1 root  wheel   6385   2/15  2003 cron.2.gz
-rw-------  1 root  wheel   6439   1/20  2003 cron.3.gz
-rw-r--r--  1 root  wheel    309   8/23 17:36 maillog
-rw-r--r--  1 root  wheel    282   8/21 00:00 maillog.0.gz
-rw-r--r--  1 root  wheel    178   8/10 00:00 maillog.1.gz
-rw-r--r--  1 root  wheel    430   7/27 00:00 maillog.2.gz
-rw-r--r--  1 root  wheel    319   4/14 00:00 maillog.3.gz
-rw-r--r--  1 root  wheel    169   3/ 7 00:00 maillog.4.gz
-rw-r--r--  1 root  wheel    368   3/ 6 00:00 maillog.5.gz
-rw-r--r--  1 root  wheel    382   3/ 3 00:00 maillog.6.gz
-rw-r--r--  1 root  wheel    163   2/20  2003 maillog.7.gz
cron は、パーミッションが 600 、ローテーションは3つまで、最大サイズが 100K 、時刻指定無し、gzip圧縮という設定です。
/var/log/cron                           600  3     100  *     Z
cron.0.gz をコピーして別名を展開してみましょう。
eden# cp cron.0.gz cron.0a.gz
eden# gzip -d cron.0a.gz
eden# ls -la cron.0a
-rw-------  1 root  wheel  101639 Aug 23 20:55 cron.0a
100Kを超えていたからOKですね。

また、maillog はサイズ指定になっていないので、gzip後のファイルサイズがまちまちです。

FreeBSD 4.7 で確認。

FreeBSD 4.7機の /var/log を見てみます。
> ls -la
total 160
drwxr-xr-x   3 root  wheel      512 Aug 17 06:00 .
drwxr-xr-x  20 root  wheel      512 Mar 26 00:19 ..
-rw-r--r--   1 root  wheel      104 Mar 25 15:25 adduser
-rw-------   1 root  wheel     5983 Aug 23 08:05 auth.log
-rw-------   1 root  wheel    14852 Aug 23 08:05 cron
drwxr-xr-x   2 root  wheel      512 Apr 10 22:51 cups
-rw-r--r--   1 root  wheel    28056 Aug 23 08:05 lastlog
-rw-r--r--   1 root  wheel        0 Oct  9  2002 lpd-errs
-rw-r-----   1 root  wheel     5243 Aug 23 04:38 maillog
-rw-r--r--   1 root  wheel    87414 Aug 23 04:38 messages
-rw-r-----   1 root  network      0 Oct  9  2002 ppp.log
-rw-------   1 root  wheel        0 Oct  9  2002 security
-rw-r-----   1 root  wheel      628 Aug 17 09:12 sendmail.st
-rw-r-----   1 root  wheel        0 Aug 17 05:00 sendmail.st.0
-rw-r-----   1 root  wheel        0 Mar 25 16:00 sendmail.st.1
-rw-r-----   1 root  wheel      628 Mar 25 15:53 sendmail.st.2
-rw-r-----   1 root  network      0 Oct  9  2002 slip.log
-rw-r--r--   1 root  wheel     4708 Aug 23 08:05 wtmp
ppp.log と slip.log のグループが network になっています。
/etc/newsyslog.conf を見ると、グループが指定されていました。
/var/log/cron                           600  3     100  *     Z
/var/log/amd.log                        644  7     100  *     Z
/var/log/auth.log                       600  7     100  *     Z
/var/log/kerberos.log                   600  7     100  *     Z
/var/log/lpd-errs                       644  7     100  *     Z
/var/log/maillog                        640  7     *    @T00  Z
/var/log/sendmail.st                    640  10    *    168   B
/var/log/messages                       644  5     100  *     Z
/var/log/all.log                        600  7     *    @T00  Z
/var/log/slip.log       root:network    640  3     100  *     Z
/var/log/ppp.log        root:network    640  3     100  *     Z
/var/log/security                       600  10    100  *     Z
/var/log/wtmp                           644  3     *    @01T05 B
/var/log/daily.log                      640  7     *    @T00  Z
/var/log/weekly.log                     640  5     1    $W6D0 Z
/var/log/monthly.log                    640  12    *    $M1D0 Z
/var/log/console.log                    600  5     100  *     Z
では、/var/log/messages の最大サイズを 80K にして newsyslog を直接起動させて見ましょう。 こんな感じに変更します。
#/var/log/messages                      644  5     100  *     Z
/var/log/messages                       644  5     80   *     Z
直接 newsyslog を起動するとわかりますが、ちょっと時間が掛かります。
mico# newsyslog
このようになります。
mico# pwd
/var/log
mico# ls -la messages*
-rw-r--r--  1 root  wheel    57 Aug 23 08:17 messages
-rw-r--r--  1 root  wheel  7389 Aug 23 08:17 messages.0.gz

戻る



(C)1999 - 2003 Kenji Ito All rights reserved.