Этап - первый ротация логов
Логи, это то, что растёт постоянно и неконтролируемо, поэтому лучше их обрезать и контролировать. Я реализовал это с помощью двух скриптов - первый универсальный архиватор логов, второй обработчик конфигов апача для выборки логов и вызова первого скрипта.
Универсальный архиватор логов
Основное назначение - ротация лога с удалением устарешвших частей лога.
Код: Выделить всё
gzlog.sh
-------------
#!/bin/sh
MAX_LOGS=${MAX_LOGS:=4}
ZIP=bzip2
EXT=bz2
if [ -z "$1" ] || [ ! -z "$2" ]; then
(
echo "ERROR: $0: Illegal call"
echo " Try to use"
echo " $0 /path/to/some.log"
echo
echo " Example"
echo " $0 /var/logs/messages"
echo
echo " Result"
echo " /var/logs/messages.0.$EXT - dumped and compress (with $ZIP) log"
echo " /var/logs/messages.1.$EXT - previos compressed log"
echo " ... other logs (more then $MAX_LOGS count) will be remove"
echo "(C) zg 2008"
) 1>&2
exit 1
fi
if [ ! -f "$1" ]; then
echo "WARNING: $0: No file '$1'" 1>&2
exit 1
fi
echo "Process: $1 for $MAX_LOGS logs"
cd `dirname "$1"`
F=`basename "$1"`
LIST=`find -s . -name "$F.[0-9]*" | sed -E "s~^./*$F\.([0-9]+)(\..*)?$~\1~" | sort -nr`
CNT=$((`echo "$LIST" | wc -l` + 1))
for i in $LIST
do
LAST=$(($i + 1))
CNT=$(($CNT - 1))
if [ -f "$F.$i.$EXT" ]; then
if [ $CNT -ge $MAX_LOGS ]; then
echo rm -f "./$F.$i.$EXT"
rm -f "./$F.$i.$EXT"
else
echo mv "./$F.$i.$EXT" "./$F.$LAST.$EXT"
mv "./$F.$i.$EXT" "./$F.$LAST.$EXT"
fi
fi
if [ -f "$F.$i" ]; then
if [ $CNT -ge $MAX_LOGS ]; then
echo rm -f "./$F.$i"
rm -f "./$F.$i"
else
echo "mv \"./$F.$i\" \"./$F.$LAST\" && $ZIP \"./$F.$LAST\""
mv "./$F.$i" "./$F.$LAST" && $ZIP "./$F.$LAST"
fi
fi
done
echo "cat ./$F | $ZIP -c > ./$F.0.$EXT"
cat "./$F" | $ZIP -c > "./$F.0.$EXT"
echo "echo -n > ./$F"
echo -n > "./$F"
выбор целевых логов апача
Основное назначение - выдирать из конфигов апача информацию о том, какие логи ведутся и архивировать их.
Код: Выделить всё
rotatelogs.sh
----------
#!/bin/sh
awk '{if($1=="ErrorLog" || $1=="CustomLog")print $2}' \
/usr/local/etc/apache/httpd.conf \
/usr/local/etc/apache/vhosts.conf \
| (
while read log
do
/usr/local/www/gzlog.sh $log
echo
done
)
Второй скрипт не является универсальным, поэтому его надо править под свой конфиг.
Результат работы будет примерно такой
Код: Выделить всё
game# ./rotatelogs.sh
Process: /usr/local/www/httpd-error.log for 4 logs
mv ./httpd-error.log.1.bz2 ./httpd-error.log.2.bz2
mv ./httpd-error.log.0.bz2 ./httpd-error.log.1.bz2
cat ./httpd-error.log | bzip2 -c > ./httpd-error.log.0.bz2
echo -n > ./httpd-error.log
Process: /usr/local/www/httpd-access.log for 4 logs
mv ./httpd-access.log.0.bz2 ./httpd-access.log.1.bz2
cat ./httpd-access.log | bzip2 -c > ./httpd-access.log.0.bz2
echo -n > ./httpd-access.log
Process: /usr/local/www/default/error.log for 4 logs
rm -f ./error.log.3.bz2
mv ./error.log.2.bz2 ./error.log.3.bz2
mv ./error.log.1.bz2 ./error.log.2.bz2
mv ./error.log.0.bz2 ./error.log.1.bz2
cat ./error.log | bzip2 -c > ./error.log.0.bz2
echo -n > ./error.log
Process: /usr/local/www/zg.xxxx/error.log for 4 logs
rm -f ./error.log.3.bz2
mv ./error.log.2.bz2 ./error.log.3.bz2
mv ./error.log.1.bz2 ./error.log.2.bz2
mv ./error.log.0.bz2 ./error.log.1.bz2
cat ./error.log | bzip2 -c > ./error.log.0.bz2
echo -n > ./error.log
Process: /usr/local/www/zg.xxxx/access.log for 4 logs
rm -f ./access.log.3.bz2
mv ./access.log.2.bz2 ./access.log.3.bz2
mv ./access.log.1.bz2 ./access.log.2.bz2
mv ./access.log.0.bz2 ./access.log.1.bz2
cat ./access.log | bzip2 -c > ./access.log.0.bz2
echo -n > ./access.log
Process: /usr/local/www/game.xxxx/error.log for 4 logs
rm -f ./error.log.3.bz2
mv ./error.log.2.bz2 ./error.log.3.bz2
mv ./error.log.1.bz2 ./error.log.2.bz2
mv ./error.log.0.bz2 ./error.log.1.bz2
cat ./error.log | bzip2 -c > ./error.log.0.bz2
echo -n > ./error.log
Process: /usr/local/www/malysh.xxxx/error.log for 4 logs
rm -f ./error.log.3.bz2
mv ./error.log.2.bz2 ./error.log.3.bz2
mv ./error.log.1.bz2 ./error.log.2.bz2
mv ./error.log.0.bz2 ./error.log.1.bz2
cat ./error.log | bzip2 -c > ./error.log.0.bz2
echo -n > ./error.log
game#
1 - вчерашний
2 - позавчера
... и т.д.
На мелком и дохлом (ака тестовом) сервере проблема с логами худо-бедно решена

ЗЫ: знаю, что изобретаю велосипед, но важен подход к реализации!