Ротация файлов по размеру в logrotate

Для примера буду описывать ротацию логов nginx. После установки nginx, вы получите следующий конфиг для ротации логов — /etc/logrotate.d/nginx.

Все не указанные явно параметры будут браться из дефолтного конфига /etc/logrotate.conf.

Для того, чтобы защитить сервер от заполнения всего свободного пространства диска логами aceess.log, ротация раз в день не подходит. Тебе за час без напряга смогут забить весь диск логами. Лучше настроить ротацию по достижении определенного размера файла. Для этого вы используете параметр:

И ждете, что по достижении размера файла access.log в десять мегабайт, будет произведена ротация. На самом деле не будет. По-умолчанию, logrotate запускается раз в сутки, поэтому он при всем желании не сможет следить за размером файла и ротировать его чаще, чем раз в сутки.

За его запуск отвечает скрипт в директории /etc/cron.daily/logrotate. Для того, чтобы logrotate мог проверять размер лог файла хотя бы раз в час, скрипт запуска надо перенести в директорию /etc/cron.hourly. А для более частой проверки, добавить его напрямую в cron с нужным интервалом запуска. Например, раз в 5 минут.

Допустим вы все это сделали, но логи все равно не будут ротироваться при достижении заданного размера. Понять, в чем же теперь проблема, не так просто. При запуске logrotate вы не увидите никаких ошибок. Он просто ничего не будет делать. Понять, в чем проблема, можно только при запуске в режиме отладки. Там вы увидите ошибку, если в этот день ротация уже была хотя бы раз.

Смысл тут в том, что logrotate сегодня уже произвел ротацию и создал архив лога с определенным именем и второй раз такой же файл он сделать не может. А маска имени файла при создании настроена в формате %Y%m%d. За эту маску отвечает параметр в /etc/logrotate.conf:

Самый простой вариант — это просто закомментировать этот параметр, тогда все архивы логов будут иметь следующую маску в файлах:

И так далее. Если же вам хочется сохранить исходный формат лога для всех файлов, а для тех, что ротируются по размеру, настроить другую маску имени, используйте дополнительный параметр:

Формат имени архивного лога будет access.log.2019-08-26_15-1566819154.gz. Имена больше не будут дублироваться и logrotate сможет корректно запускать ротацию при достижении указанного размера файла. Обращаю внимание, что формат тут отличается от привычной конструкции в date, к которой обычно все привыкли. Сделать формат %Y-%m-%d_%H-%M не получится. Logrotate не поймет маску с минутами %M. Так что для уникальности имени в пределах одного часа надо использовать %s.

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

Запускать через cron logrotate с достаточно высокой периодичностью, например раз в час или чаще.
Настроить маску файла для архива лога, чтобы она была уникальной в каждый момент запуска logrotate.

Вот пример для ротации конфигов nginx или apache по достижении размера лог файла в 10 мегабайт.

Не забудьте создать директорию /var/log/nginx/old для хранения старых логов. На этом у меня все по ротации логов в logrotate с учетом размера файла.

Обновлено: 27.08.2019 — 15:57

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *