ある日、ふと/var/logの下を見てみたら、1.5GBytesに膨れ上がった某ログファイルがあって腰を抜かした件について。
思えば、サーバソフトウェアなどでは、インストールしたらまずそのものの設定で頭が一杯だ。
一方で、いわゆるシモの世話といいますか、吐き出すログの設定には頭が回ってなかったことに深く反省するのであります。
俺の例でいえば、apache、clamav、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/en_US.ISO8859-1/books/handbook/configtuning-configfiles.html)
日本語
[http://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/book.html#CONFIGTUNING-CONFIGFILES](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](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<a class="keyword" href="http://d.hatena.ne.jp/keyword/%5B%5B%5Bcc%5Dyy%5Dmm%5Ddd%5D%5BT%5Bhh%5Bmm%5Bss?mode=edit" rel="nofollow">?</a>]
$は、[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が書かれたファイルをここで指定する。
以上