Solaris | Apacheのログローテーションを毎晩0時に実行する
sasaki - Tue, 2008-04-08 17:28
毎晩0時にApacheのログをローテーションする。
1月1日0時 〜 1月1日24時 > access_log.20080101.gz
1月2日0時 〜 1月2日24時 > access_log.20080102.gz
という感じ。
Apacheを再起動するので、root ユーザで実行する。再起動といっても停止・起動ではなく、kill -HUPしているだけ。
■Apacheのログをローテーションするスクリプト
logrotate.sh (700か744にしてrootだけが実行できるようにしておく)
#! /bin/sh
#
# Apache Log Rotate
#
#
LOGDIR="/export/home/www/logs"
LOGFILES="access_log error_log script_log ssl_misc_log"
DATE=`TZ=JST-2 date +%Y%m%d`
# access_log, error_log...それぞれ日付を付けたファイル名にする。
# ファイルが存在しなくても処理は続けられる。
for i in $LOGFILES
do
mv $LOGDIR/$i $LOGDIR/$i.$DATE
done
# Apacheを再起動する。
kill -HUP `cat /var/run/httpd.pid`
sync
# 圧縮すると10分の1程度になる。
for i in $LOGFILES
do
gzip $LOGDIR/$i.$DATE
done
sync
# 必要であれば所有者を変更する。
for i in $LOGFILES
do
chown tanaka:tanaka $LOGDIR/$i.$DATE.gz
chown tanaka:tanaka $LOGDIR/$i
done
LOGDIR ログが置いてあるディレクトリを指定する。
LOGFILES ログファイル名を指定する。複数指定が可能。
DATE 夜、0時にこのスクリプトが実行されるので、前日の日付を求める。
今が、00:02:54だとすると、
$ date
Tue Apr 8 00:02:54 JST 2008
一時的にタイムゾーンを指定して表示する。上と同じ表示になる。
$ TZ=JST-9 date
Tue Apr 8 00:02:54 JST 2008
7時間前の時間を求めると、確実に前日を求めることができる。JST-9+7なので、JST-2となる。
TZ=JST-2 date
Mon Apr 7 17:02:03 JST 2008
7時間後の場合は、JST-9-7なので、JST-16となる。(プラスとマイナスが逆なので注意)
■Cronで毎晩0時にログローテーションを実行する
rootユーザが実行できるようにsu - してからcronを編集する。
# cron -e
# minute (0-59),
# hour (0-23),
# day of the month (1-31),
# month of the year (1-12),
# day of the week (0-6 with 0=Sunday).
0 0 * * * /etc/scripts/logrotate.sh
数日間は、mailコマンドで、大きなエラーが発生していないかチェックする。
問題なかったので、 ログを捨てる記述を加えた。
0 0 * * * /etc/scripts/logrotate.sh > /dev/null 2>&1
- 7909 reads