apacheのログローテーションスクリプト
http://extstrg.asabiya.net/pukiwiki/index.php?apache%A4%CE%A5%ED%A5%B0%A5%ED%A1%BC%A5%C6%A1%BC%A5%B7%A5%E7%A5%F3%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8目次 †
概要 †
apacheのログをローテーションさせ、前日の日付のログを書き出すスクリプト。
ログローテーションの際にはapacheのプロセス再起動が行われる。
主な機能
- apacheのログを指定された世代分保管してローテーションさせる
- /YYYY/MM/の形式のディレクトリを自動生成する
- [LOGFILE].[YYYYMMDD]の形式で前日分のログを切り出す
本スクリプトは4つのスクリプトにて構成されている。
- httpd_logrotate.sh
全体を制御するスクリプト。他のスクリプトはこのスクリプトから呼び出される - logrotate.sh
ログのローテーションを行うスクリプト - make_date-dir.sh
YYYY/MM形式のディレクトリを生成するスクリプト - logcut.sh
指定日付のログを切り出すスクリプト
httpd_logrotate.sh †
環境ごとの変更箇所は下記
DOMAIN1= 元ログファイルの保管位置 DOMAIN2= 元ログファイルの保管位置(複数ドメイン時) HTTPCTRL= apacheのプロセス再起動に使用するapachectlの保管場所(絶対パス) LOGROTATE= logrotate.shの保管場所(絶対パス) MKDATEDIR= make_date-dir.shの保管場所(絶対パス) LOGCUT= logcut.shの保管場所(絶対パス) LOGFILE= ローテーションの稼動ログ(絶対パス)
#!/bin/sh # ----------------------------- # Apache Log Management Script # ----------------------------- # Version : 1.1 # update : 2007.02.22 export LANG=C export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin ## Base Directory DOMAIN1="/home/httpd/labala/logs/" DOMAIN2="/home/httpd/johannaho/logs/" ## SystemPermSet HTTPCTRL="/etc/init.d/apachectl" LOGROTATE="/home/system/script/httpd_log/logrotate.sh" MKDATEDIR="/home/system/script/httpd_log/make_date-dir.sh " LOGCUT="/home/system/script/httpd_log/logcut.sh" LOGFILE="/home/system/logs/httpd_logrotate.log" # Last Date DATEY=`date +%Y --date '1 days ago'` DATEM=`date +%m --date '1 days ago'` DATED=`date +%d --date '1 days ago'` TODAY=`date +%Y%m%d` LASTDAY=`date +%Y%m%d --date '1 days ago'` ## Start Log STARTDATA=`date +%Y/%m/%d\ %H:%M:%S` echo $STARTDATA - LogRotate Start >> $LOGFILE ## Apache Stop $HTTPCTRL stop >> $LOGFILE sleep 5 ## LogRotate # # USE : $LOGROTATE [RotateTarget FullPath] # $LOGROTATE $DOMAIN1/access.log $LOGROTATE $DOMAIN1/error.log $LOGROTATE $DOMAIN2/access.log $LOGROTATE $DOMAIN2/error.log ## Apache Start TRYCOUNT=1 RETRY=10 while [ $TRYCOUNT -le $RETRY ]; do ps ax | grep apache | grep httpd > /dev/null if [ $? = 1 ]; then $HTTPCTRL start >> $LOGFILE sleep 10 fi TRYCOUNT=$(($TRYCOUNT+1)) done ## Make Directory $MKDATEDIR $DOMAIN1/log_archive/ $MKDATEDIR $DOMAIN2/log_archive/ ## Logcut $LOGCUT $DATEY$DATEM$DATED access_log $DOMAIN1/log_archive/$DATEY/$DATEM/access_log.$DATEY$DATEM$DATED $DOMAIN1/access* $LOGCUT $DATEY$DATEM$DATED access_log $DOMAIN2/log_archive/$DATEY/$DATEM/access_log.$DATEY$DATEM$DATED $DOMAIN2/access* ## End Log ENDDATA=`date +%Y/%m/%d\ %H:%M:%S` echo $ENDDATA - LogRotate End >> $LOGFILE # EOF
logrotate.sh †
使用の際に特に設定は不要です。
単体で稼動させる際には下記の書式で実行します。
- 使用方法
./logrotate.sh [ローテート対象を絶対パスで指定]
- 例
./logrotate.sh /usr/local/apache/log/access_log
#!/bin/sh # ------------------------ # HTTP Log Rotate Script # ------------------------ # Version : 1.1 # update : 2007.02.22 export LANG=C export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin # Set ROTATE="40" TODAY=`date +%d/%b/%Y` # Check if [ -f $1 ]; then LOG=$1 else echo "ERR : logfile not found" echo "USE : ./logrotate.sh [/PATH/LOGFILE]" exit 0 fi # Ecex test -f $LOG.$ROTATE && rm -rf $LOG.$ROTATE while [ $ROTATE -ge 1 ]; do i=$((ROTATE-1)) if [ -f $LOG.$i ]; then mv $LOG.$i $LOG.$ROTATE ; fi ROTATE=$i done mv $LOG $LOG.1 # grep $TODAY $LOG.1 > $LOG touch $LOG # EOF
make_date-dir.sh †
引数で与えられたディレクトリの配下に./年/月/日のディレクトリを作成します。
作成されるディレクトリはコマンド実行日の前日の値になります。
使用の際に特に設定は不要です。
単体で稼動させる際には下記の書式で実行します。
- 使用方法
./make_date-dir.sh [ローテート対象を絶対パスで指定]
- 例
./make_date-dir.sh /usr/local/apache/log/access_log
2007/04/10に実行した場合は以下のディレクトリが作成されます
/usr/local/apache/log/access_log/2007/04/10
#!/bin/sh # -------------------------------- # Make DateName Directory Script # -------------------------------- # Version : 1.1 # update : 2007.02.22 export LANG=C export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin # Set DATEY=`date +%Y --date '1 days ago'` DATEM=`date +%m --date '1 days ago'` DATED=`date +%d --date '1 days ago'` TODAY=`date +%Y%m%d` LASTDAY=`date +%Y%m%d --date '1 days ago'` # Check if [ -z $1 ]; then echo "ERR : directory not found" echo "USE : ./make_date-dir.sh [/PATH/LOGFILE]" exit 0 fi if [ -d $1 ]; then LOGPATH=$1 else echo "ERR : directory not found" echo "USE : ./make_date-dir.sh [/PATH/LOGFILE]" exit 0 fi # Ecex ## Make Dir # Year Dir test -d $LOGPATH/$DATEY || mkdir $LOGPATH/$DATEY # Monthly Dir test -d $LOGPATH/$DATEY/$DATEM || mkdir $LOGPATH/$DATEY/$DATEM # Dayily Dir #test -d $LOGPATH/$DATEY/$DATEM/$DATED || mkdir $LOGPATH/$DATEY/$DATEM/$DATED # EOF
logcut.sh †
引数で渡されたログファイルを切り出し対象日付で別ファイルに切り出します。
ログの日付フォーマットはログの種類により異なるため、ログフォーマットの切替用フラグを引数内に指定します。
使用の際に特に設定は不要です。
単体で稼動させる際には下記の書式で実行します。
- 使用方法
./logcut.sh [切り出し対象日付] [ログフォーマットフラグ] [出力ファイル名] [入力ファイル名]
- 例
./logcut.sh 20070410 access_log /usr/local/apache/log/access_20070410.log /usr/local/apache/log/access_log
#!/bin/sh # ------------------------ # Log Cutting Script # ------------------------ # Version:2.0 # update :2005.09.29 export LANG=C export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin # Hint # Commnad [DATE] [FLAG] [OUTPUT] [INPUT] ## -- Check -- # $1 # target date if [ -z $1 ]; then echo "ERR : target date not found" echo "USE : ./logcut.sh [DATE] [FLAG] [OUTPUT] [INPUT]" exit 0 else DATEWC=`echo $1 | wc -m` if [ $DATEWC = "9" ]; then TARGETDATE="$1" DATEY=`date +%Y --date $TARGETDATE` DATEM=`date +%m --date $TARGETDATE` DATED=`date +%d --date $TARGETDATE` DATEE=`date +%e --date $TARGETDATE | sed "s/ //"` DATEN=`date +%b --date $TARGETDATE` DATEW=`date +%a --date $TARGETDATE` else echo "ERR : "$1" is abnormality format" exit 0 fi fi # $2 # date format case $2 in access_log) TARGET=$DATED/$DATEN/$DATEY ;; error_log) TARGET=$DATEW" "$DATEN" "$DATED ;; messages) DATEWC=`echo $DATEE | wc -c` if [ $DATEWC = 2 ]; then TARGET=$DATEN..$DATEE.[0-9][0-9]: else TARGET=$DATEN.$DATEE.[0-9][0-9]: fi ;; *) TARGET=$DATEN.$DATED ;; esac # $3 # output path if [ -z $3 ]; then echo "ERR : Output not found" echo "USE : ./logcut.sh [DATE] [FLAG] [OUTPUT] [INPUT]" exit 0 else OUTFILE="$3" fi # $4 # input file if [ -z $4 ]; then echo "ERR : Input not found" echo "USE : ./logcut.sh [DATE] [FLAG] [OUTPUT] [INPUT]" exit 0 else if [ -r $4 ]; then INFILE="$4" else echo "ERR : "$4" not read | not found" exit 0 fi fi # Exec cat $INFILE* | sort | grep $TARGET > $OUTPATH/$OUTFILE exit 0
Last-modified: 2007-11-29 (木) 10:42:55 (6173d)