syslog などでログを溜めると、いずれは溢れてしまいます。このために、 FreeBSD では、標準で newsyslog というプログラムを用いてログの管理 を行っています。newsyslog は cron より呼び出され(標準では毎時間)、 設定ファイル /etc/newsyslog.conf に定義された条件に合致したログを 処理します。
処理の仕方は、バックアップを取り、指定された個数を越えたバックアップ は消去します。バックアップを取る際には gzip による圧縮を指定すること が出来ます。処理のタイミングは、指定サイズを越えている、全回のバック アップから指定時間を経過した、あるいは指定時間になった(定時)の3つの 種類が選べます。
下は、/etc/newsyslog.conf の一部です。
# logfilename [owner:group] mode count size when [ZB] [/pid_file] [sig_num] /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/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 /var/log/console.log 640 5 100 * Z |
mode は、ファイルの mode です。count は保存しておくバックアップの数
(+1 になります。0から7まで)、size はこのサイズを越えた場合にバックアップ
を取る指定(Kbyte単位)で* の時にはサイズでは見ません。時間での
指定が when の項目で、ここに * を用いると時間では見ませんので、
サイズの方での指定が必要になります。また、時間の指定方法は2つあり、
インターバル時間を指定する方法と、時刻を指定する方法です。単純に、
数字を指定した場合は前者になり、その時間だけ経過していたらバックアップ
をとります。但し、標準では newsyslog は毎時間毎に起動されるので、
その時間に条件に達していなければ、見送られます。
一方、指定時刻での
指定方法は2種類あり、@ で指定する場合と$ で指定する
場合です。@は制限付ISO8601時刻フォーマットを利用する場合で、
このフォーマットは一般には [[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]]と
なっています。例えば、20010801 は、2001年8月1日を表し、
20010801T00 は同じ日付の0時を表しています。一方、01T00
と書いた場合には省力したものについては現在時の値を利用しますので、
これは毎月1日の0時を表す事になります。
今一つの時刻の指定方法である $ で始まる場合ですが、こちらは
毎週、毎日あるいは毎月に、処理したいような場合に便利な書き方です。
フォーマットは、Dhh 、Ww、WwDhh、Mdd
、あるいは MddDhh のいずれかが利用できます。それぞれの意味は、
D が毎日、W が毎週、M が毎月を意味し、hh で時間(0-23)、w で曜日
(0:日曜日...6:土曜日)、ddで日(1-31 特別に月の最後を意味するLがあります)
を表しています。従って、D00 は毎日0時を、W6D12 は
毎週土曜日の12時を、M1D0 は毎月1日の0時を表す事になります。
その次のフィールドの [ZB] は、Z ならば gzip で圧縮し、B ならば
そのままバックアップをします。従って、Zが指定されていたらならば、
maillog は maillog.0 にバックアップされ、gzip で圧縮されて maillog.0.gz
として残されます。maillog については T00 であったので、毎日
0時にバックアップが取られ、前のmaillog.0.gz は maillog.1.gz に移動
させられます。そうして毎日これが続けられ、最終的に count を越える
時点(今の場合は 7を越えた時)で消去されます。
その他のフィールドについてはここでは説明を省略しますので、興味 のある方はmanを参照してください。
さて、先程 ipmon の結果を security に送るように設定をしましたが、 現在 newsyslog には
# logfilename [owner:group] mode count size when [ZB] [/pid_file] [sig_num] /var/log/security 600 10 100 * Z |
となっているので、sizeを越える度にバックアップが取られ、 実際にはnewsyslogは1時間毎に動くので恐らくは12時間後には最初のログは 消えてしまいます。これを毎日バックアップを取り、30日は残しておくには 次のようにします。
# logfilename [owner:group] mode count size when [ZB] [/pid_file] [sig_num] /var/log/security 600 30 * @T00 Z |
但し、トラフィックのログは非常に巨大になるので、いきなりこれをせずに、 最初は count を 10 位にして、平均的なログがどの位になるかを観察してから、 大体何日分を取れるかを予想します。この場合、かなり余裕を持った見積りに しておかなければなりません。何故ならば、アタックがあった時にこそ、そうした ログが必要なのですが、そうした時には非常に大量のトラフィックが予想される からです。