Ротация логов или как убить сервер при попытке его спасти

log_rДа, я наверное из тех людей, что учатся на своих ошибках. Слава богу это у меня не во всем.

Случилось так, что как-то раз какая то кучка идиотов решила устроить DDoS одной из моих железок. DDoS или они меня заходя на один и тот же сайт без остановок и ничего кроме как высокого Load Average они не добились. Скажу даже так,я их заметил то не сразу…Ребятки были дружно отправлены в blackList файерволла, и на этом все закончилось. Но перед тем, как это сделать мне пришлось изрядно ахренеть, так как читать access логи, которые весят по 12Gb крайне неудобно. Ну пожалуй это все равно что пытаться съесть бегемота, пока он спит..

Ну а к чему я это все? К тому что у меня тут будет очередное учебное пособие на тему как настроить правильную ротацию логов, чтобы быть крутым пацаном.

На самом деле ничего там сложного нет. Если у вас Debian или Ubuntu, то у вас уже стоит штука, которая называется logrotate. Если ее у вас по какой то причине нет, то ставим ее следующим способом:

apt-get install logrotate

Разбирать логи мне нужно как минимум у нескольких сайтов, причем там живут логи как Apache так и Nginx. Так что запомним это и создадим файл конфигурации своим любимым редактором:

vim /etc/logrotate.d/example

Далее этот файл забиваем следующим кофигом:

/var/www/user/site.ru/logs/*.log {

# Если размер лога будет равен или больше 5Mb, то он будет подвержен ротации.
# Возможно еще делать ротацию по времени, а именно: weekly - раз в неделю, daily - раз в день, monthly - раз в месяц
size 5M

# отсутствие файла не вызывает ошибку
missingok

# количество хранимых отработанных резервных копий
rotate 20

# Сжимать в gzip копию лога
compress

#сжимать последнюю копию только при следующей ротации
delaycompress

# не ротировать лог, если он пуст
notifempty

# добавлять к наименованию файла резервной копии даты в формате "-YYYYMMDD"
dateext

# задать права доступа, владельца и группу создаваемого журнального файла
create 0640 www-data adm

# отправлять свежую созданную копию на указанный e-mail
mail pomoi@site.ru

# запустить скрипт после ротации всех логов
sharedscripts

#выполнить далее указанный скрипт сразу после ротации
postrotate

#  Заставим NGINX перечитать конфигурацию
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

# Заставим Apache перечитать конфигурацию
if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
/etc/init.d/apache2 reload > /dev/null
fi
# Скрипт закончен
endscript

}

Далее сохраняем это дело и проверяем все ли правильно мы сделали в конфиге:

logrotate -d /etc/logrotate.d/example

Если нужно сделать ротацию сейчас, то делаем это так:

logrotate -f /etc/logrotate.d/example

Кстати, если вы используйте такую хрень, как WebMin, то у вас уже должна быть «админка», в которой можно настроить ротацию логов.

logrotation

напочитать: