MISO10 BLOG

Avatar

MISOスタッフが綴るブログ

Home » Server » Blog article: アクセスログの管理

アクセスログの管理

WEBサーバのアクセスログの扱いはきちんと管理しておかないと
以外にDISKを食いつぶすやっかいな奴です。
Apacheの定義もデフォルトのままで、cronでローテートもいいけど
アクセス解析やらのツールを使うケースや、指定した日だけのアクセスログを見たい時には
日付単位でログを管理した方が便利。
Apacheのhttpd.confで以下のように定義すると、その日だけのアクセスログファイルで管理できる。


  ErrorLog  "|/usr/local/apache2/bin/rotatelogs /home/xxxxx/logs/error_log.%Y%m%d 86400 540"
  CustomLog "|/usr/local/apache2/bin/rotatelogs /home/xxxxx/logs/access_log.%Y%m%d 86400 540" "combined"

こんな感じになる。
access_log.20081023
error_log.20081023

ただ、これも1つのディレクトリに保管され続けていくと、開発時にログを見ながらデバッグするには
邪魔だし、何せこのままだと、DISKの容量も食いつぶす。

そこで、アクセスログ保管ディレクトリの配下に/saveといったディレクトリーを作成して
cronで深夜0時を超えた時にシェルを起動させて、前日のログを圧縮して保管する。


#!/bin/csh
set LOG_DIR=$1
if ( $LOG_DIR == "" ) then
  echo "usage: $0 <log_dir>"
  exit 1
endif

set TARGET_DIR=$1/save/
if ( ! -d $TARGET_DIR ) then
  echo "$TARGET_DIR: No such directory"
  exit 1
endif

set DATE=`date --date '1 day ago' +'%Y%m%d'`
cd $LOG_DIR
foreach FILE (*_log.${DATE})
  set FIRST_SIZE=`\ls -l ${FILE}`
  sleep 60
  set SECOND_SIZE=`\ls -l ${FILE}`
  if ( $FIRST_SIZE[5] == $SECOND_SIZE[5] ) then
    if ( -e ${TARGET_DIR}${FILE}.gz ) then
      set TIME=`date +%H%M%S`
      \mv -bf ${FILE} ${TARGET_DIR}${FILE}.${TIME}
      set FILE=${FILE}.${TIME}
    else
      \mv -bf ${FILE} ${TARGET_DIR}${FILE}
    endif
    gzip ${TARGET_DIR}${FILE} >&amp;amp;amp; /dev/null
  else
    echo "LOG is still been WRITING\!\!"
    echo "target file: " {$TARGET_DIR}${FILE}
    echo "FIRST_SIZE: $FIRST_SIZE[5], SECOND_SIZE: $SECOND_SIZE[5]"
  endif
end
exit 0

Cシェルは賛否両論あるけど、好きだから使ってます・・。
sleep 60で一旦止めるのは、Apacheで吐き出されているログファイルを圧縮しないために
ログのサイズを比較するため。
ただ、前日のアクセスログを対象にするようにしているので、もっとシンプルにしてもいいかも。

あとは、crontab -eとかで


30 0 * * * /usr/local/bin/gzip_log.sh /home/www/xxxx/logs/accesslog

といった感じに定義しておけば、いいだけ。

関連記事

Comment[0]

Post Your Comment