13. newsyslog

 
 サーバアプリケーションを動作させてしていると、いろいろなログが出力されます。ログはアクセスの解析やセキュリティのチェックのために必要なものですが、ほっておくと徐々に溜まっていき、ディスクスペースを圧迫してきます。  ログが大きくなったタイミングや定期的にログファイルを圧縮したり、世代管理して古いログを削除するために FreeBSD には newsyslog というユーティリティがデフォルトで存在ます。 13.1 newsyslog の仕組み 13.2 newsyslog の記述 13.3 newsyslog 記述例

13.1 newsyslog の仕組み

 もともと、UNIX にはシステムの動きを 1分周期 (デフォルト) でチェックする cron という daemon が存在します。  cron は crontab という設定ファイルを参照して、やるべき作業を決めます。  crontab にデフォルトで
0   *   *   *   *   root    newsyslog
 という 1行が存在します。  これは、毎0秒に newsyslog ユーティリティを動作させる、という意味です。  newsyslog ユーティリティは /etc/newsyslog.conf というファイルを参照して、ログをローテーションさせるかどうかの動きを決定し、処理します。

13.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
 簡単に説明しておきます(詳細は man を参照してください)。
/var/log/cron  ローテーションさせるファイル名です。
600  ログファイルの、ファイルのパーミッション (owner, group, world に対する read, write, execute 権限) を示します。
3  バックアップファイルのバージョン最大数です。  この場合、cron.0 ~ cron.3 までのバックアップファイルができることになります。  0 ~ 3 で数が小さいものほど最新のバックアップファイルになります。  最大数を超えたファイルは自動的に削除されます。
100  ファイルがこの値を超える値になったらローテーションさせるということを示しています。  単位は、kb (キロバイト)です。  * を指定しているとサイズのチェックは行いません。
*  いつローテーションさせるかというタイミングの指定です。  指定方法は、多数あります。  * は時間的なタイミングではローテーションしないという意味です。  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 の範囲で指定できます。
Z  バックアップファイルの保存形式です。  Z を指定するとバックアップファイルを FreeBSD4.xRELEASE までは gzip で、 FreeBSD5.xRELEASE 以降は bzip2 で圧縮します。  B を指定するとバイナリファイルの意味となります。これはバイナリファイルでなくても 指定可能です。バイナリファイルで指定していないと、ローテーションさせるときに  Sep 5 00:00:00 ns newsyslog[56463]: logfile turned over というふうにローテーションさせたことを明示的に書き込みが行われます。 これが書き込まれると後でログの解析で不便になることがある場合は、ASCII ファイルであっても B を指定します。  Z も B も指定したくないときは、"-" を指定します。
 例題では、この後ろには何も指定していませんが、この後ろには daemon のプロセス ID を調べるために読むファイルを指定します。  このフィールドが存在する場合、このファイルに書かれたプロセス ID に signal_number が送られます。正しく認識するために、このフィールドは "/" から開始する必要があります。  例えば、Apache の場合は、ログファイルがローテーションされて rename されても 最初につかんだファイルにずっとログを書き続けます。なので、シグナルを送って Apache を再起動させる必要がありますので、ここを指定します。
 Apache のような特殊な例を除けば、newsyslog は起動されるたびに newsyslog.conf を参照しなおしますので、特に何かを再起動させなくても、newsyslog.conf を書き換えておけば、最短1分後には、反映させることが出来ます。

13.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年間分のバックアップファイルを保持するという意味です。  それぞれ、自分の好みに合わせて設定すればよいかと思います。