FreeBSD ログローテ

FreeBSD では newsyslog でログローテする。

# vi 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/httpd-access.log		644  7     *    $W6D0 Z     /var/run/httpd.pid 30

・mode
ログファイルのパーミッション。

・count
ログローテしたファイルを何個まで保存するかの指定。

・size
ログの最大サイズ。単位は KB。超えたらログローテする。

・when
ログローテするタイミング。sizeを指定している場合は無効。
フォーマットは、Dhh、Ww、WwDhh、Mdd、 MddDhhのどれか。
D:毎日
W:毎週
M:毎月
hh:時間(0〜23)
w:曜日(0:日曜日〜6:土曜日)
dd:日(1〜31)
L:月の最後の日

※$W6D0は毎週土曜日0時の意。

・ZJB
圧縮の有無。省略可能。
Z:gz圧縮してログローテ
J:bz圧縮してログローテ
B:圧縮せずにそのままログローテ

・/pid_file
・sig_num
ログファイルが切り替わった際に /pid_file のプロセスに対し sig_num のシグナルを送信する。
省略可能。

※Apacheなど、常にログファイルをつかんでいるプロセスは newsyslog による
 ログファイルの切り替わりを検知できないため、ログファイルが切り替わった際に
 プロセスを再起動するなどして新しいログファイルにログを出力させる必要がある。
 「/var/run/httpd.pid 30」は「httpdプロセスに対し SIGUSR1 のシグナルを送信する」という意味になる。
 UNIX(POSIX) での SIGUSR1 の値は30番。
 Apache における SIGUSR1 は graceful のシグナルとなるので、
 「ログファイルが切り替わったら Apache を graceful で再起動させる」という意味になる。