EMIT-Japan WebCT レター

  • 登録・解除
  • プライバシーポリシー

WebCTのログ管理(1)

WebCTのログをローテーションさせて管理する

(*注意 本Tipsの内容はLinuxでのみ検証しています。その他のプラットフォームでは実行できませんので予めご了承ください。)

WebCTの内部ではApacheという汎用httpサーバが動いています。 これは$install_dir/webct/serverというディレクトリ内にバンドルされているもので、この中のlogsという部分に各種アクセスログやエラーログが蓄積される仕組みになっています。 ユーザがアクセスするたびにログが蓄積されるので、ユーザ数が多いサーバではこれらのファイルが膨大に膨れあがってしまいます。 この状態だと、ログがディスクを圧迫し続け効率がよくない上に、アクセス解析する際に障害になることがあります。そこでログローテーションというアプローチを考えてみます。

logrotate

WebCTがサポートしているRed Hat Linux 7.3では、標準でlogrotateというプログラムが組みこまれており、これがsyslog等ログを自動的にローテーションしてくれます。 これをWebCTにも適用し、自動的にローテーションするようにしてみましょう。

logrotateの設定

logrotateはデフォルトでrpmパッケージとして組みこまれています。よってrpmコマンドでインストールされたファイルの詳細を得ることが出来ます。 rpm -ql logrotateと入力してみると以下のような出力を得ることが出来るはずです。

$ rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.6.4
/usr/share/doc/logrotate-3.6.4/CHANGES
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
    

設定ファイルは/etc/logrotate.conf、および/etc/logrotate.d以下。 また/etc/cron.daily/logrotate以下のスクリプトにより1日1度logrotateが実行されているのが解ります。設定は/etc/logrotate.confに設定を書くことが出来るのですが、/etc/logrotate.d以下にアプリケーション名のファイルを作成し、設定を書く方が管理の効率面から推奨される書き方になります。

既にいくつかのファイルが設定されているので、これを見てみましょう。 /etc/logrotate.dにcdしてlsします。

# cd /etc/logrotate.d/
# ls
rpm  syslog
    

catしてみるとよくわかりますが、syslogにはsyslog関連のログのローテーションの設定が。 rpmには/var/log/rpmpkgsのローテーションに関する設定が記述されています。 このディレクトリにwebctのログローテーションに関する設定を書けばいいことがわかります。 今回は/etc/logrotate.d/webctというファイルを作成して管理することにします。

/etc/logrotate.d/webctの作成

ログの管理に「これ」という決定打はありません。管理するサーバの規模やディスク状況によって柔軟に設定を記述することが重要になってきます。 ここではあくまで一例を書いてみますが、設定のより詳細な情報はlogrotateのmanpageを参照ください。 なお、ここではwebctをインストールしたディレクトリを/home/webct/webct_rootとします。

/home/webct/webct_root/webct/server/logs/*_log {
  weekly
  missingok
  rotate 1000
  compress
  delaycompress
  notifempty
  create 640 webct webct
  sharedscripts
  postrotate
    /bin/kill -HUP `cat /home/webct/webct_root/webct/server/logs/httpd.pid 
2>/dev/null` 2>/dev/null
  endscript
}

# (/bin/kill ... 2>/dev/null は実際には1行で記述してください。)

以下各設定の説明を行います。

weekly
1週間に1度ローテーションすることを示しています。 weeklyの指定の他にdaily、monthlyなどを書くことが出来ます。
missingok
ログファイルが存在しなくてもエラーを出さず次にいきます。 エラーを出力したいのであればnomissingokというオプションが書けます。
rotate 1000
1000回ローテーションします。1000回を越えると自動的に削除されていきます。
compress
古いlogfileをgzipします。gzipしたくない場合nocompressとも書けます。
delaycompress
直ぐgzipするのではなく、少し遅らせてgzipします。compressが設定されているときにのみ有効です。
notifempty
ログファイルが空であればローテーションしません。 これに対する設定はifempty
create [パーミッション] [ユーザ名] [グループ名]
ファイルの生成権限をコントロールできます。
sharedscripts
複数指定したログファイルに対してpostrotateまたはprerotateで記述されたコマンドを実行します。 ここではアクセスログとエラーログの2つに対して実行しているので記述する必要があります。
postrotate ... endscript
この間に記述されたコマンドをローテーションに実行します。

logrotateのテスト

これで正常にローテーションするかチェックする必要があります。 /etc/cron.daily/logrotateの内容を見るとわかるのですが、logrotate自体は 単純に/usr/sbin/logrotateという実行コマンドの後ろに設定ファイルを付けて呼び出されているだけにすぎません。 よって以下のコマンドで簡単にテストできます。

# /usr/sbin/logrotate /etc/logrotate.d/webct

初回はログがrotateしませんが、実行された時刻がlogrotate自体のログに記録されます。 今回の設定ですと次の週からrotateされるわけですが、そこまで待っていてはテストになりません。 よってlogrotate自身のログを編集し、時間を適当に巻き戻す作業を行います。

logrotate自身のログは/var/lib/logrotate.statusに存在しています。 これをエディタで開くと以下のような記述が見えるはずです。

"/home/webct/webct_root/webct/server/logs/access_log" 2004-5-24
"/home/webct/webct_root/webct/server/logs/error_log" 2004-5-24
    

ここで2004-5-24等(logroteteを実行した日付)になっている箇所を編集して適当に古い時刻を設定した後、 再度logrotateコマンドを実行します。

# /usr/sbin/logrotate /etc/logrotate.d/webct

これを行った後サーバのログファイルが正常にrotateされたかどうか見てみます。

$ find /home/webct/webct_root/webct/server/logs/
/home/webct/webct_root/webct/server/logs/
/home/webct/webct_root/webct/server/logs/access_log
/home/webct/webct_root/webct/server/logs/error_log
/home/webct/webct_root/webct/server/logs/httpd.pid
/home/webct/webct_root/webct/server/logs/access_log.1
/home/webct/webct_root/webct/server/logs/error_log.1
    

以上のようにaccess_log.1やerror_log.1が出来ていれば成功です。 何らかのエラーメッセージが表示された場合や、ファイルが生成されていない様な場合は、再度設定ファイルを見直し、/var/lib/logrotate.statusを巻戻したのち再び実行する必要があります。

(2004年 6月)