[SH] Работа с апачем
Добавлено: 2008-06-26 20:41:38
Это больше всего подходит к скриптам на коленке, но у меня есть желание накропать немного простых скриптов на тему "управление апачем. сделал и забыл", поэтому и создаю отдельную тему. Апач у меня 1.3, но не суть важно.
Этап - первый ротация логов
Логи, это то, что растёт постоянно и неконтролируемо, поэтому лучше их обрезать и контролировать. Я реализовал это с помощью двух скриптов - первый универсальный архиватор логов, второй обработчик конфигов апача для выборки логов и вызова первого скрипта.
Универсальный архиватор логов
Основное назначение - ротация лога с удалением устарешвших частей лога. вызов: gzlog.sh /путь/до/лога. В результате будет создан архив лога, а сам файл обнулён. По-началу было желание использовать newsyslog, но там слишком всё сложно, чтоб быть простым решением, хотя в принципе, можно использовать и его.
выбор целевых логов апача
Основное назначение - выдирать из конфигов апача информацию о том, какие логи ведутся и архивировать их. Всё достаточно просто и примитивно. Сразу оговорюсь, что на данный момент меня интерисует простота и на реальный хостинг с большой нагрузкой ставить эти скрипты не рекомендуется!
Второй скрипт не является универсальным, поэтому его надо править под свой конфиг.
Результат работы будет примерно такой Если запускать этот скрипт каждую ночь, то на каждый лог будут архивы за четыре дня: 0 - сегодняшний
1 - вчерашний
2 - позавчера
... и т.д.
На мелком и дохлом (ака тестовом) сервере проблема с логами худо-бедно решена
ЗЫ: знаю, что изобретаю велосипед, но важен подход к реализации!
Этап - первый ротация логов
Логи, это то, что растёт постоянно и неконтролируемо, поэтому лучше их обрезать и контролировать. Я реализовал это с помощью двух скриптов - первый универсальный архиватор логов, второй обработчик конфигов апача для выборки логов и вызова первого скрипта.
Универсальный архиватор логов
Основное назначение - ротация лога с удалением устарешвших частей лога.
Код: Выделить всё
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 - позавчера
... и т.д.
На мелком и дохлом (ака тестовом) сервере проблема с логами худо-бедно решена
ЗЫ: знаю, что изобретаю велосипед, но важен подход к реализации!