20081023 16:32(木) koyama
アクセスログの管理
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; /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