ログ管理
syslogとその周辺 応用編
back top next
■syslog について  ・・・ログのローテート(循環)・・・

collector がログをファイルに書き出していると、どんどんファイルサイズが大きくなってしまい、扱いにくくなります。比較的最近までの Linux では 2GB を超えるファイルが作れなかったりしますし、FreeBSD でも vi で開けなくなるなどのアプリケーション側の制限が出てきます。

もしファイルが作成出来たとしても、多くのログを受け取ることでそのパーティションがあふれてしまうと、必要なサービスが提供できなくなってしまいます。

そのため、ログのサイズや期間を決めてログをローテートするツールが開発されています。

■ newsyslog

FreeBSD では標準でインストールされています。/usr/sbin/newsyslog です。
ローテートする基準としては、次の3点があります。
  1. ログが指定サイズより大きくなった(キロバイト単位で指定)
  2. 最後に循環してから指定した時間が経過した
  3. 指定した時刻になった
newsyslog は cron(8) から起動します。指定した時間から1時間以内に起動されたらローテートを実行するという仕様になっていますので、1時間以上の間を開けてcronの設定をする必要があります。

newsyslog の設定は /etc/newsyslog.conf でおこないます。設定項目は次のようになっています。

● logfilename
ローテートの対象となるログファイルです。絶対パスで記述します。

● [owner:group] (オプション)
ローテートしたファイルの owner と group を設定します。

● mode
ログファイルとローテートしたファイルの permission のモードを数値で指定します。

● count
ローテート後に保存しておくファイルの数を指定します。manpage を見ますとそのログを含めていくつ保存するかという記述がありますが、実際には指定した数より2つ多いようです。/var/log/cron の場合には 3 と指定してありますが、cron, cron.0.gz〜cron.3.gz で5つになります。

● size
ログファイルが指定した大きさに達したときにローテートします。キロバイト(1024バイト)単位で指定します。

● when
いつローテートするかを指定します。特定の時刻もしくは時間間隔で指定します。
いくつかの記述方法があります。

  • "*"
    この項目を設定しません。ローテートのタイミングは size のみに依存します。

  • 時刻指定 (制限付きISO8601形式)
    @[[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]]
      cc: 西暦年の上2桁 hh: 24時間制での時
      yy: 西暦年の下2桁 mm: 分
      mm: 月 dd: 日 ss: 秒
    の形式で指定します。

    newsyslog は指定した時刻の1時間以内に実行されたときにローテートしますから、mm(分) や ss(秒) の指定はほとんど意味がありません。例えば1日の5時を指定したいときには、"@01T05" とします。この場合、指定しない項目はそのときの時刻の値となります。

  • 日付や曜日を指定
    $[Dhh], $[Ww[Dhh]], $[Mdd[Dhh]]
      hh: 24時間制での時
      w: 曜日 (0〜6, 0が日曜日)
      dd: 日付 (1〜31, "L" もしくは "l" を指定すると月末)
    の形式で指定します。

    例えば毎週金曜の16時を指定したいときには "$W5D16" となり、毎月5日の6時ならば "$M5D6" となります。

  • 時間間隔を指定
    単に数値を書きます。
    "168" と指定しますと 168時間毎、つまり1週間毎になります。
● [ZJB] (オプション)
ローテートしたファイルを圧縮するかどうかを指定します。指定しないときはなにもしません。それぞれの意味は次のようになります。
  • "Z"
    gzip(1) で圧縮します。

  • "J"
    bzip2(1) で圧縮します。

  • "B"
    バイナリファイルであることを指定します。
    newsyslog はローテートしたときに syslog の形式でログを出しますが、このバイナリファイルのときにはその機能を抑制します。

  • "-"
    なにもしません。後ろの項目になにか指定したいときに記述します。
● [/pid_file] (オプション)
ローテートした後に特定のプロセスにシグナルを送りたいとき、PID が書いてあるファイル名を絶対パスで記述します。

● [sig_num] (オプション)
pid_file で指定したプロセスにどのシグナルを送るかを指定します。
デフォルトでは SIGHUP です。

具体例のほうがわかりやすいかと思いますので、4.7-RELEASE の標準でインストールされている newsyslog.conf の例を リスト2 に挙げます。

  リスト2     標準でインストールされている /etc/newsyslog.conf
# configuration file for newsyslog
# $FreeBSD: src/etc/newsyslog.conf,v 1.25.2.10 2002/05/24 15:40:09 gshapiro Exp $
#
# Note: some sites will want to select more restrictive protections than the
# defaults.  In particular, it may be desirable to switch many of the 644
# entries to 640 or 600.  For example, some sites will consider the
# contents of maillog, messages, and lpd-errs to be confidential.  In the
# future, these defaults may change to more conservative ones.
#
# logfilename          [owner:group]    mode count size when [ZJB] [/pid_file] [sig_num]
/var/log/cron                           600  3     100  *      Z
/var/log/amd.log                        644  7     100  *      Z
/var/log/auth.log                       600  7     100  *      Z
/var/log/kerberos.log                   600  7     100  *      Z
/var/log/lpd-errs                       644  7     100  *      Z
/var/log/maillog                        640  7     *    @T00   Z
/var/log/sendmail.st                    640  10    *    168    B
/var/log/messages                       644  5     100  *      Z
/var/log/all.log                        600  7     *    @T00   Z
/var/log/slip.log       root:network    640  3     100  *      Z
/var/log/ppp.log        root:network    640  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
/var/log/console.log                    600  5     100  *      Z

例えば /var/log/maillog を見ますと、次のような条件でローテートをおこないます。
  • ファイルのモードは 640 (-rw-r-----)
  • 保存する数は 9 つ (maillog, maillog.0〜maillog.7)
  • サイズの制限はない
  • 毎日0時にローテートする
  • gzip で圧縮する
実際に手元の /var/log/maillog を調べてみますと、そのようにローテートされていることがわかります。

  リスト3     /var/log/maillog のローテート状況
#kei# ls -l /var/log/maillog*
-rw-r-----  1 root  wheel  1948 Nov  8 03:17 /var/log/maillog
-rw-r-----  1 root  wheel   625 Nov  8 00:00 /var/log/maillog.0.gz
-rw-r-----  1 root  wheel   619 Nov  7 00:00 /var/log/maillog.1.gz
-rw-r-----  1 root  wheel   622 Nov  6 00:00 /var/log/maillog.2.gz
-rw-r-----  1 root  wheel   619 Nov  5 00:00 /var/log/maillog.3.gz
-rw-r-----  1 root  wheel   623 Nov  4 00:00 /var/log/maillog.4.gz
-rw-r-----  1 root  wheel   706 Nov  3 00:00 /var/log/maillog.5.gz
-rw-r-----  1 root  wheel   727 Nov  2 00:00 /var/log/maillog.6.gz
-rw-r-----  1 root  wheel   630 Nov  1 00:00 /var/log/maillog.7.gz

■ logrotate

RedHat の Erik Troan さん <ewt@redhat.com> が作られたもので、RedHat のディストリビューションでは標準で入っているようです。ports/sysutils/logrotate からインストールできます。

設定は logrotate.conf などのファイルに書きまして、引数にその設定ファイル名を指定して起動します。
manpage に載っている設定例は リスト4 のようになります。

  リスト4     logrotate の設定例
# sample logrotate configuration file
errors sysadmin@my.org
compress

/var/log/messages {
    rotate 5
    weekly
    postrotate
                              /sbin/killall -HUP syslogd
    endscript
}

"/var/log/httpd/access.log" /var/log/httpd/error.log {
    rotate 5
    mail www@my.org
    errors www@my.org
    size=100k
    sharedscripts
    postrotate
                              /sbin/killall -HUP httpd
    endscript
}

/var/log/news/* {
    monthly
    rotate 2
    missingok
    errors newsadmin@my.org
    postrotate
                              kill -HUP `cat /var/run/inn.pid`
    endscript
    nocompress
}


{ } で括られていないところはグローバルオプションです。ここでは errors と compress が指定されています。errors は処理中にエラーが起こったときの報告先メールアドレスで、compress はログファイルを gzip で圧縮するという設定です。

ローテートの対象となるログはそれぞれ { } ブロックで区切って指定します。

● /var/log/messages

rotate 5
-- 5つの保存ファイルを作成する

weekly
-- 毎週ローテートする (通常は日曜)

portrotate 〜 endscript
-- "/sbin/killall -HUP syslogd" を実行する

● /var/log/httpd/access.log, /var/log/httpd/error.log

rotate 5
-- 5つの保存ファイルを作成する

mail www@my.org
-- 保存ファイルが5つを超えたときに、古いログは www@my.org にメールで送信してから削除する

errors www@my.org
-- (グローバルオプションを上書き)
-- エラーが起こったときは www@my.org にメールする

size=100k
-- ログが100kbytesになったらローテートする

sharedscripts
-- postrotate に指定するスクリプトをログごとではなく、1度しか実行しない

postrotate 〜 endscript
-- "/sbin/killall -HUP httpd" を実行する

● /var/log/news/* (説明していないオプションのみ)

monthly
-- 毎月ローテートする (通常は1日)

missingok
-- ログファイルがないときには無視して次の処理をおこなう

nocompress
-- gzip で圧縮しない

logrotate は設定方法がややこしく、ローテートするタイミングもかなり大雑把にしかきめられませんが、ログファイルがたくさんあるときにはまとめて指定できるのが良いかと思います。メールが使えるのも便利でしょう。

back top next
Copyright(C) 1995-2003 Infoscience Corporation. All rights reserved. 
※このページの内容は 『FreeBSD PRESS No.14 (2003 JANUARY) 毎日コミュニケーションズ刊』 に掲載されたものです。