1. newsyslog の仕組み
もともと、UNIX にはシステムの動きを 1分周期 (デフォルト) でチェックする cron というデーモンが存在します。
cron は crontab という設定ファイルを参照して、やるべき作業を決めます。
FreeBSD には crontab にデフォルトで
# Rotate log files every hour, if necessary.
0 * * * * root newsyslog
という 1行が存在します。
これは、毎時 0 分に newsyslog ユーティリティを動作させる、という意味です。
newsyslog ユーティリティは /etc/newsyslog.conf というファイルを参照して、ログをローテーションさせるかどうかの動きを決定し、処理します。
2. newsyslog.conf の記述
newsyslog.conf はデフォルトで以下のように記述されているはずです(余分なコメントは省略しています、またバージョンによって多少の差異は存在ます)。
# logfilename [owner:group] mode count size when [ZB] [/pid_file] [sig_num]
/var/log/cron 600 3 100 * Z
/var/log/amd.log 644 7 100 * Z
/var/log/kerberos.log 644 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
定義を簡単に説明しておきます。
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
↑
ローテーションさせるファイル名です。
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
↑
ログファイルのオーナーユーザ名とグループ名です。
省略可能。
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
↑
ログファイルの、ファイルのパーミッション (owner, group, world に対する read, write, execute 権限) を示します。
chmod で指定するアレです。
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
↑
バックアップファイルのバージョン最大数です。
3 と書いておけば、.0 ~ .3 までのバックアップファイルができることになります。
数が小さいものほど最新のバックアップファイルになります。
最大数を超えたファイルは自動的に削除されます。
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
↑
ファイルがこの値を超える値になったらローテーションさせるということを示しています。
単位は、kb (キロバイト)です。
* を指定しているとサイズのチェックは行いません。
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
↑
いつローテーションさせるかというタイミングの指定です。
指定方法は、多数あります。
* は時間的なタイミングではローテーションしないという意味です。
単に数字を書けば時間を意味し、168 と書けば、168÷24 → 7 ですから、最後にローテーションされた日から1週間後にローテーションさせるという意味です。
@T00 は、毎日午前 0:00 にローテーションさせるという意味です。
@01T05 は、毎日午前 1:05 にローテーションさせるという意味です。
$W6D0 は、毎週土曜日の午前 0:00 にローテーションさせるという意味です。
$M1D0 は、毎月1日の午前 0:00 にローテーションさせるという意味です。
$ で指定するのが便利な使い方で、M を指定すると毎月になりその後に続く数字が日付になります。
W は毎週で、0 が日曜日で 6 の土曜日まで指定できます。
D はその日の時刻で 0 ~ 23 の範囲で指定できます。
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
↑
バックアップファイルの保存形式です。
Z を指定するとバックアップファイルを FreeBSD4.xRELEASE までは gzip で、FreeBSD5.xRELEASE 以降は bzip2 で圧縮します。
B を指定するとバイナリファイルの意味となります。これはバイナリファイルでなくても指定可能です。バイナリファイルで指定していないと、ローテーションさせるときに
Sep 5 00:00:00 ns newsyslog[56463]: logfile turned over
というふうにローテーションさせたことを明示的に書き込みが行われます。
これが書き込まれると後でログの解析で不便になることがある場合は、ASCII ファイルであっても B を指定します。
Z も B も指定したくないときは、"-" を指定します。
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
↑
プロセス ID を調べるために読むファイルを指定します。
このフィールドが存在する場合、このファイルに書かれたプロセス ID に signal_number が送られます。正しく認識するために、このフィールドは "/" から開始する必要があります。
例えば、apache の場合は、ログファイルがローテーションされて rename されても最初につかんだファイルにずっとログを書き続けます。なので、シグナルを送って apache を再起動させる必要がありますので、ここを指定します。
3. newsyslog.conf 記述例
では、Apache 用にはどんな風に記述するか、1例を紹介します。newsyslog.conf の最下行に下の2行を追加してください。記憶しておくために、# で始まるコメント行を添えておく方がよいでしょう。
/var/log/httpd-access.log 644 12 * $M1D0 B /var/run/httpd.pid
/var/log/httpd-error.log 644 12 * $M1D0 B /var/run/httpd.pid
意味は、上記の説明でだいたいわかると思いますが、Apache の出力する、/var/log/httpd-access.log と /var/log/httpd-error.log の2つのログファイルを、毎月の月初めの午前 0:00 にローテーションさせ、1年間分のバックアップファイルを保持するという意味です。
それぞれ、自分の好みに合わせて設定すればよいかと思います。