воскресенье, 9 января 2011 г.

Большие злые логи

Недавно столкнулся с проблемой - начал отваливаться squid3, но как показывает моя практика squid обычно отваливается когда заканчивается место на диске где стоит система.

Запускаю df вижу, что места осталось около одного процента, при том что обычно забито лишь 30% объема.

Что делать? первым делом убиваю бэкапы. + 30 гигов.
Бросаю это дело на время, иду к юзерам.
Прихожу сотрю снова почти нет места.
Что так забивает место? Мысль первая логи.
Без раздумий убиваю лог сквида, не жалко. Не помогает.
Запуская iotop и вижу ужасную картину, rsyslogd постоянно пишет на винт со скоростью 3 метра в секунду. Что за херь?
Убиваю rsyslogd. Начинаю разбираться в чем дело.
Оказалось demon.log, auth.log и еще всякие разрослись на 200 ГБ. быстренькао их удаляю и начинаю пилить настройки rsyslogd, но, выясняется, что он только собирает часть логов, а упралвяет, архивирует logrotate.

Трогать стандартные настройки logrotate в /etc/logrotate.conf не вижу особого смысла.
А вот перелопатить папочку /etc/logrotate.d/ стоит.
$sudo nano /etc/logrotate.d/rsyslog

по умолчанию он выглядит примерно так:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug

и ротация включена только для syslog.
Добавим ротацию логов daemon.log, auth.log, user.log и т.д.
/var/log/daemon.log
{
rotate 3 # хранить 3 последних логов
weekaly # ротация каждую неделю, можно поставить каждый день daily
missingok # отсутствие файла не является ошибкой
notifempty # не обрабатывать пустые файлы
nodelaycompress # сразу сжимать старый лог,
# delaycompress оставляет послудний ротированный лог не сжатым
compress # сжимать ротируемый файл
# create 640 root # права и пользователей для создания новых логов. параметр необязательный.
postrotate # скрипт выполняемый после ротации
reload rsyslog >/dev/null 2>&1 || true
endscript # конец скрипта
}

Примерно такие конструкции следует поставить послу каждого лога.
Вот и вся настройка.

Теперь надо проверить.
$sudo logrotate -d /etc/logrotate.d/rsyslog

Если все правильно ошибок не будет, если они есть то внимательно смотрим что пишут.

А теперь можно и запустить ротацию
$ sudo logrotate -v -f /etc/logrotate.d/rsyslog

Все. Конфиги перечитаны, и применены.