FreeBSD 11.1 RELEASE - OS 起動後の基本的な設定 - newsyslog (ログローテーション)

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

1. newsyslog の仕組み

 もともと、UNIX にはシステムの動きを 1分周期 (デフォルト) でチェックする cron という daemon が存在します。  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 を再起動させる必要がありますので、ここを指定します。  newsyslog は起動されるたびに newsyslog.conf を参照しなおしますので、特に何かを再起動させなくても、newsyslog.conf を書き換えておけば、最短1分後には、反映させることが出来ます。

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