目次

概要

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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-11-29 (木) 10:42:55 (5986d)