/var/logの下がえらいことになっていたでござる。(あるいはFreeBSDでログのローテーション設定をするには(logrotateではなくnewsyslog))。

ある日、ふと/var/logの下を見てみたら、1.5GBytesに膨れ上がった某ログファイルがあって腰を抜かした件について。


思えば、サーバソフトウェアなどでは、インストールしたらまずそのものの設定で頭が一杯だ。
一方で、いわゆるシモの世話といいますか、吐き出すログの設定には頭が回ってなかったことに深く反省するのであります。


俺の例でいえば、apacheclamav、dhcpdのログが手つかずでありました(冒頭、1.5GBytesになっていたログはdhcpdのもの)。
portsから入れたサーバのログは、いちど確認したほうがいいだろう。
基本は/var/logの下に出力されるが、/usr/local/var/logが(あれば)見た方がいいし、場合によっては思わぬところに吐き出されてる可能性もある。


newsyslogd

さて、FreeBSDではログのローテートはnewsyslogdが行う。Linuxではlogrotateにあたるもの。


handbookではこのへん
英語(推奨)
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/configtuning-configfiles.html
日本語
http://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/book.html#CONFIGTUNING-CONFIGFILES


newsyslogの設定サンプル

man newsyslog.confを見ればだいたい分かる。以降、英文はここからの引用。
http://www.freebsd.org/cgi/man.cgi?query=newsyslog.conf&apropos=0&sektion=0&manpath=FreeBSD+9.0-RELEASE&arch=default&format=html


以下の順番で並べるだけ。間はスペースで埋めること(separated with whitespace)。

# filename          [owner:group]    mode count size when [ZB] [/pid_file] [sig_num]

以下、サンプル。

/var/log/local7.log    600  10 1024 * JC 

/var/log/local7.logが、1MBytesを超えた時点でローテーション。
生成されたログのパーミッションは600で、bzip2で圧縮され(J)、10個保存される。

/var/log/httpd-access.log    644  7 * @T03 JC

apacheのログを毎日午前3時にローテーション、圧縮して7日分残す。

設定を変えたらnewsyslogdを再起動。

# /etc/rc.d/newsyslog restart
Creating and/or trimming log files.
#


設定について


filename
 その名の通り。

[owner:group]
 省略可。アーカイブ後ファイルの所有ユーザとグループ

mode
 ログファイルとアーカイブ後ファイルのパーミッション
 サーバソフトが作るオリジナルのパーミッションと合わせておくのがよい。
 というのも、newsyslogdがログをローテーションするときに新しいログファイルを作るから。
 owner:groupにはなく、こちらにだけ「ログファイル」という記載があるのはなぜでしょうな。

count
 残す「アーカイブ後の」ログファイル数。
 3なら、アーカイブされたログが3つになる。

size
 このサイズを超えたときにローテーションされる。
 キロバイトで指定。
 アスタリスク(*)の場合には、サイズベースでのローテーションはしない。

when
 ローテーションする時間、時刻契機を指定。
 インターバル、時刻を指定できる。
 書式は二つ。後述する。
 注意すべき点は、newsyslog自体が一時間に一回しか起動しないこと。
 これはつまり以下のような動作となる、と理解した。
 ・仮に、newsyslogdが毎時0分に起動し、かつ
 ・毎時1分にローテーションする設定にした場合、
 →例えば、1時1分ではなく、2時にローテーションが発生する。

newsyslog.conf(5)より抜粋

If a time is specified, the log file will only be trimmed if newsyslog(8) is run within one hour of the specified time. If an interval is specified, the log file will be trimmed if that many hours have passed since the last rotation.

 書式

 @で書くもの、$で書くものの二つ。
 @は、[[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]]
 $は、[Dhh], [Ww[Dhh]]と[Mdd[Dhh]]
 サンプルを見るのが一番よい。(これもmanから抜粋)

 $D0 毎日午前0時。@T00と同じ意味
 $D23 毎日23時。@T23と同じ意味
 $W0D23 毎週日曜23時
 $W5D16 毎週金曜16時
 $M1D0 毎月1日の午前0時。@01T00と同じ意味
 $M5D6 毎月5日の午前6時。@05T06と同じ意味

flags 一部のみ。基本JCでよい。
 J ログをbzip2で圧縮。Zならgzip。Xならxz。
 C ログが存在しない場合に作る。

 G パターンにマッチしたログファイルを対象にできる。
 
pid_file
 通常、ログをローテーションした後はsyslogdにシグナルが送られる。
 syslogd以外のプロセスにシグナルを送りたい場合には、プロセスの
 pidが書かれたファイルをここで指定する。


以上