Solaris | Apacheのログローテーションを毎晩0時に実行する

 

毎晩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