Настройка Logrotate

Дмитрий Корнев
1 сентября 2016

Если веб-сервер используется активно, то разные логи быстро растут. Если пустить это на самотёк, то однажды они займут всё свободное место на диске. Чтобы контролировать ситуацию существует программа Logrotate, которая автоматически архивирует и удаляет старые логи. Такой процесс называется ротацией логов.

Установка в Debian:

apt install logrotate

В каталоге /etc/logrotate.d разные программы добавляют свои настройки для Logrotate.

Далее пример файла настроек, который можно создать на веб-сервере. Один для всех сайтов сразу. Предназначен для настроек обработки логов, генерируемых Nginx. Но ничего не мешает добавить в перечень и другие каталоги для обработки.

/var/log/www/site1.com/*.log
/var/log/www/site2.ru/*.log
/var/log/www/etc.ru/*.log
{
    # Ежедневная ротация.
    daily
    # Отсутствие файла не является ошибкой.
    missingok
    # Не более 30 логов, т.к. ротация ежедневная, то это история за 30 дней.
    rotate 30
    # Ротируемые файлы сжимаются.
    compress
    # Сжимать предыдущий файл при следующей ротации.
    delaycompress
    # Не обрабатывать пустые файлы.
    notifempty
    # После ротации создать пустой файл с заданными правами и пользователем.
    create 640 root www-data
}

Сохранить такой файл можно с любым именем, например так /etc/logrotate.d/sites. Когда файл создан, то сразу он не активен, логи в соответствии с его настройками не обрабатываются.

Следующая команда помогает убедиться, что файл создан корректно:

logrotate -d /etc/logrotate.d/sites

В данном случае обработки не будет! Вы просто получите информацию о том, какие логи файл настроек затронет и т.д. Если какие-то параметры написаны с ошибкой, то вы это узнаете.

А вот эта команда уже непосредственно запускает ротацию:

logrotate -v -f /etc/logrotate.d/sites

Обработка логов произойдёт тут же. А далее будет происходить автоматически в соответствии с настройками файла.

Logrotate не работает

Если возникала такая проблема, посомотрите файл /var/lib/logrotate/status. В нём видно последние обработанные логи. Запустите ещё раз Logortate в режиме отладки, посмотрите, что он говорит.

Вот пример проблемной ситуации:

bash-4.3# logrotate -d /etc/logrotate.d/sites
reading config file /etc/logrotate.d/sites

Handling 1 logs

rotating pattern: /var/log/www/portal.site/*.log
/var/log/www/portal.dev/*.log
 after 1 days (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/www/portal.site/access.log
 log does not need rotating
considering log /var/log/www/portal.site/error.log
 log does not need rotating
considering log /var/log/www/portal.dev/access.log
 log does not need rotating
considering log /var/log/www/portal.dev/error.log
 log does not need rotating
not running prerotate script, since no logs will be rotated
not running postrotate script, since no logs were rotated

Файлы логов существуют и растут, Logrotate почему-то не видит их, сообщая что они пустые и не нуждаются в обработке. В итоге ничего не происходит. Почему так? Хз.

Решение: просто удалить все логи из интересующих нас папок, перезапустить Nginx. Подождать пока в логах что-то появится. Ещё раз выполнить команду отладки. На этот раз можно видеть, что ротация логов должна будет работать:

bash-4.3# logrotate -d /etc/logrotate.d/sites
reading config file /etc/logrotate.d/sites

Handling 1 logs

rotating pattern: /var/log/www/portal.site/*.log
/var/log/www/portal.dev/*.log
 after 1 days (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/www/portal.site/access.log
 log needs rotating
considering log /var/log/www/portal.site/error.log
 log does not need rotating
considering log /var/log/www/portal.dev/access.log
 log needs rotating
considering log /var/log/www/portal.dev/error.log
 log does not need rotating
rotating log /var/log/www/portal.site/access.log, log->rotateCount is 30
dateext suffix '-20160905'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
previous log /var/log/www/portal.site/access.log.1 does not exist
renaming /var/log/www/portal.site/access.log.30.gz to /var/log/www/portal.site/access.log.31.gz (rotatecount 30, logstart 1, i 30),
renaming /var/log/www/portal.site/access.log.29.gz to /var/log/www/portal.site/access.log.30.gz (rotatecount 30, logstart 1, i 29),
...
renaming /var/log/www/portal.site/access.log.0.gz to /var/log/www/portal.site/access.log.1.gz (rotatecount 30, logstart 1, i 0),
rotating log /var/log/www/portal.dev/access.log, log->rotateCount is 30
dateext suffix '-20160905'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
previous log /var/log/www/portal.dev/access.log.1 does not exist
renaming /var/log/www/portal.dev/access.log.30.gz to /var/log/www/portal.dev/access.log.31.gz (rotatecount 30, logstart 1, i 30),
renaming /var/log/www/portal.dev/access.log.29.gz to /var/log/www/portal.dev/access.log.30.gz (rotatecount 30, logstart 1, i 29),
...
renaming /var/log/www/portal.dev/access.log.0.gz to /var/log/www/portal.dev/access.log.1.gz (rotatecount 30, logstart 1, i 0),
running prerotate script
running script with arg /var/log/www/portal.site/*.log
/var/log/www/portal.dev/*.log
: "
 /home/user/serv/hits.sh
"
renaming /var/log/www/portal.site/access.log to /var/log/www/portal.site/access.log.1
creating new /var/log/www/portal.site/access.log mode = 0640 uid = 0 gid = 33
renaming /var/log/www/portal.dev/access.log to /var/log/www/portal.dev/access.log.1
creating new /var/log/www/portal.dev/access.log mode = 0640 uid = 0 gid = 33
running postrotate script
running script with arg /var/log/www/portal.site/*.log
/var/log/www/portal.dev/*.log
: "
 #[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
"
removing old log /var/log/www/portal.site/access.log.31.gz
error: error opening /var/log/www/portal.site/access.log.31.gz: No such file or directory

Комментарии