collector がログをファイルに書き出していると、どんどんファイルサイズが大きくなってしまい、扱いにくくなります。比較的最近までの
Linux では 2GB を超えるファイルが作れなかったりしますし、FreeBSD でも vi で開けなくなるなどのアプリケーション側の制限が出てきます。
もしファイルが作成出来たとしても、多くのログを受け取ることでそのパーティションがあふれてしまうと、必要なサービスが提供できなくなってしまいます。
そのため、ログのサイズや期間を決めてログをローテートするツールが開発されています。 ■
newsyslog
FreeBSD では標準でインストールされています。/usr/sbin/newsyslog です。
ローテートする基準としては、次の3点があります。
- ログが指定サイズより大きくなった(キロバイト単位で指定)
- 最後に循環してから指定した時間が経過した
- 指定した時刻になった
newsyslog は cron(8) から起動します。指定した時間から1時間以内に起動されたらローテートを実行するという仕様になっていますので、1時間以上の間を開けてcronの設定をする必要があります。
newsyslog の設定は /etc/newsyslog.conf でおこないます。設定項目は次のようになっています。
● logfilename
ローテートの対象となるログファイルです。絶対パスで記述します。
● [owner:group] (オプション)
ローテートしたファイルの owner と group を設定します。
● mode
ログファイルとローテートしたファイルの permission のモードを数値で指定します。
● count
ローテート後に保存しておくファイルの数を指定します。manpage を見ますとそのログを含めていくつ保存するかという記述がありますが、実際には指定した数より2つ多いようです。/var/log/cron
の場合には 3 と指定してありますが、cron, cron.0.gz〜cron.3.gz で5つになります。
● size
ログファイルが指定した大きさに達したときにローテートします。キロバイト(1024バイト)単位で指定します。
● when
いつローテートするかを指定します。特定の時刻もしくは時間間隔で指定します。
いくつかの記述方法があります。
- "*"
この項目を設定しません。ローテートのタイミングは size のみに依存します。
- 時刻指定 (制限付きISO8601形式)
@[[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]]
cc: 西暦年の上2桁 hh: 24時間制での時
yy: 西暦年の下2桁 mm: 分
mm: 月 dd: 日 ss: 秒
の形式で指定します。
newsyslog は指定した時刻の1時間以内に実行されたときにローテートしますから、mm(分) や ss(秒) の指定はほとんど意味がありません。例えば1日の5時を指定したいときには、"@01T05"
とします。この場合、指定しない項目はそのときの時刻の値となります。
- 日付や曜日を指定
$[Dhh], $[Ww[Dhh]], $[Mdd[Dhh]]
hh: 24時間制での時
w: 曜日 (0〜6, 0が日曜日)
dd: 日付 (1〜31, "L" もしくは "l" を指定すると月末)
の形式で指定します。
例えば毎週金曜の16時を指定したいときには "$W5D16" となり、毎月5日の6時ならば "$M5D6"
となります。
- 時間間隔を指定
単に数値を書きます。
"168" と指定しますと 168時間毎、つまり1週間毎になります。
● [ZJB] (オプション)
ローテートしたファイルを圧縮するかどうかを指定します。指定しないときはなにもしません。それぞれの意味は次のようになります。
- "Z"
gzip(1) で圧縮します。
- "J"
bzip2(1) で圧縮します。
- "B"
バイナリファイルであることを指定します。
newsyslog はローテートしたときに syslog の形式でログを出しますが、このバイナリファイルのときにはその機能を抑制します。
- "-"
なにもしません。後ろの項目になにか指定したいときに記述します。
● [/pid_file] (オプション)
ローテートした後に特定のプロセスにシグナルを送りたいとき、PID が書いてあるファイル名を絶対パスで記述します。
● [sig_num] (オプション)
pid_file で指定したプロセスにどのシグナルを送るかを指定します。
デフォルトでは SIGHUP です。
具体例のほうがわかりやすいかと思いますので、4.7-RELEASE の標準でインストールされている newsyslog.conf
の例を リスト2 に挙げます。
| リスト2 |
標準でインストールされている /etc/newsyslog.conf |
# configuration file for newsyslog
# $FreeBSD: src/etc/newsyslog.conf,v 1.25.2.10 2002/05/24 15:40:09 gshapiro Exp $
#
# Note: some sites will want to select more restrictive protections than the
# defaults. In particular, it may be desirable to switch many of the 644
# entries to 640 or 600. For example, some sites will consider the
# contents of maillog, messages, and lpd-errs to be confidential. In the
# future, these defaults may change to more conservative ones.
#
# 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/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/maillog を見ますと、次のような条件でローテートをおこないます。
- ファイルのモードは 640 (-rw-r-----)
- 保存する数は 9 つ (maillog, maillog.0〜maillog.7)
- サイズの制限はない
- 毎日0時にローテートする
- gzip で圧縮する
実際に手元の /var/log/maillog を調べてみますと、そのようにローテートされていることがわかります。
| リスト3 |
/var/log/maillog のローテート状況 |
#kei# ls -l /var/log/maillog*
-rw-r----- 1 root wheel 1948 Nov 8 03:17 /var/log/maillog
-rw-r----- 1 root wheel 625 Nov 8 00:00 /var/log/maillog.0.gz
-rw-r----- 1 root wheel 619 Nov 7 00:00 /var/log/maillog.1.gz
-rw-r----- 1 root wheel 622 Nov 6 00:00 /var/log/maillog.2.gz
-rw-r----- 1 root wheel 619 Nov 5 00:00 /var/log/maillog.3.gz
-rw-r----- 1 root wheel 623 Nov 4 00:00 /var/log/maillog.4.gz
-rw-r----- 1 root wheel 706 Nov 3 00:00 /var/log/maillog.5.gz
-rw-r----- 1 root wheel 727 Nov 2 00:00 /var/log/maillog.6.gz
-rw-r----- 1 root wheel 630 Nov 1 00:00 /var/log/maillog.7.gz |
|
|
■ logrotate
RedHat の Erik Troan さん <ewt@redhat.com> が作られたもので、RedHat のディストリビューションでは標準で入っているようです。ports/sysutils/logrotate
からインストールできます。
設定は logrotate.conf などのファイルに書きまして、引数にその設定ファイル名を指定して起動します。
manpage に載っている設定例は リスト4 のようになります。
# sample logrotate configuration file
errors sysadmin@my.org
compress
/var/log/messages {
rotate 5
weekly
postrotate
/sbin/killall -HUP syslogd
endscript
}
"/var/log/httpd/access.log" /var/log/httpd/error.log {
rotate 5
mail www@my.org
errors www@my.org
size=100k
sharedscripts
postrotate
/sbin/killall -HUP httpd
endscript
}
/var/log/news/* {
monthly
rotate 2
missingok
errors newsadmin@my.org
postrotate
kill -HUP `cat /var/run/inn.pid`
endscript
nocompress
} |
|
|
{ } で括られていないところはグローバルオプションです。ここでは errors と compress が指定されています。errors
は処理中にエラーが起こったときの報告先メールアドレスで、compress はログファイルを gzip で圧縮するという設定です。
ローテートの対象となるログはそれぞれ { } ブロックで区切って指定します。
● /var/log/messages
rotate 5
-- 5つの保存ファイルを作成する
weekly
-- 毎週ローテートする (通常は日曜)
portrotate 〜 endscript
-- "/sbin/killall -HUP syslogd" を実行する
● /var/log/httpd/access.log, /var/log/httpd/error.log
rotate 5
-- 5つの保存ファイルを作成する
mail www@my.org
-- 保存ファイルが5つを超えたときに、古いログは www@my.org にメールで送信してから削除する
errors www@my.org
-- (グローバルオプションを上書き)
-- エラーが起こったときは www@my.org にメールする
size=100k
-- ログが100kbytesになったらローテートする
sharedscripts
-- postrotate に指定するスクリプトをログごとではなく、1度しか実行しない
postrotate 〜 endscript
-- "/sbin/killall -HUP httpd" を実行する
● /var/log/news/* (説明していないオプションのみ)
monthly
-- 毎月ローテートする (通常は1日)
missingok
-- ログファイルがないときには無視して次の処理をおこなう
nocompress
-- gzip で圧縮しない
logrotate は設定方法がややこしく、ローテートするタイミングもかなり大雑把にしかきめられませんが、ログファイルがたくさんあるときにはまとめて指定できるのが良いかと思います。メールが使えるのも便利でしょう。 |