**目次 [#e72cb7ae]
#contents
**概要 [#hbc557a7]
apacheのログをローテーションさせ、前日の日付のログを書き出すスクリプト。~
ログローテーションの際にはapacheのプロセス再起動が行われる。~
~
主な機能
-apacheのログを指定された世代分保管してローテーションさせる
-/YYYY/MM/の形式のディレクトリを自動生成する
-[LOGFILE].[YYYYMMDD]の形式で前日分のログを切り出す

本スクリプトは4つのスクリプトにて構成されている。
-httpd_logrotate.sh ~
全体を制御するスクリプト。他のスクリプトはこのスクリプトから呼び出される
-logrotate.sh~
ログのローテーションを行うスクリプト
-make_date-dir.sh~
YYYY/MM形式のディレクトリを生成するスクリプト
-logcut.sh~
指定日付のログを切り出すスクリプト

**httpd_logrotate.sh [#fbdf4189]
環境ごとの変更箇所は下記

 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 [#rfa1d4c1]
使用の際に特に設定は不要です。~
単体で稼動させる際には下記の書式で実行します。~

-使用方法
 ./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 [#ff443e9f]
引数で与えられたディレクトリの配下に./年/月/日のディレクトリを作成します。~
作成されるディレクトリはコマンド実行日の前日の値になります。~
使用の際に特に設定は不要です。~
単体で稼動させる際には下記の書式で実行します。~

-使用方法
 ./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 [#wd2ebb11]
引数で渡されたログファイルを切り出し対象日付で別ファイルに切り出します。~
ログの日付フォーマットはログの種類により異なるため、ログフォーマットの切替用フラグを引数内に指定します。
使用の際に特に設定は不要です。~
単体で稼動させる際には下記の書式で実行します。~

-使用方法
 ./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
 cat $INFILE* | sort | grep $TARGET > $OUTPATH/$OUTFILE
 
 
 exit 0

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS