POPSuL:
Сегодня мы поговорим о том что такое ротация логов, с чем ее едят и насколько она вкусна. Ротация — процесс обновления чего‐то , круговорот чего‐то . Но что такое ротация логов?
Ротация логов — это процесс архивирования логов, удаление старых логов и все из этого вытекающее. Оно нужно для того, чтобы внезапно у вас не забилось все место на HDD/SSD различными логами, ну, а так же для того, чтобы не было слишком много одинаковых и очень больших лог‐файлов . При ротации логов происходит несколько вещей:
- Файл журнала архивируется и сохраняется под именем log.log.0
- Более старые логи переименовываются (log, log,0 в log.log.1 и т.д.)
- Самые старые логи удаляются
- Очищается «главный» файл лога
- Перезапускается демон пишуший логи если это необходимо
Порядок всех этих действий может быть произвольным, и зависит от напрямую от реализации утилиты для ротации логов. В linux‐based системах зачастую используется утилита logrotate которая запускается по умолчанию (покрайней мере в ubuntu) кроном раз в день и делает свою грязную работу. В bsd системах, насколько мне известно, используется newsyslog для той же самой работы, но т.к. freebsd я видел всего несколько раз в жизни — ничего полезного я сказать о ней не могу :).
Logrotate имеет свой конфигурационный файл /etc/logrotate.conf в котором описаны глобальные параметры, а так же, подключаются различные дополнительные конфиги из /etc/logrotate.d в которых описаны действия для различных демонов. Например, конфиг nginx выглядит примерно так:
Конфигурационные файлы logrotate человекопонятные. В частности, в этом конфигурационном файле описываются правила для файлов попадающийх под glob‐шаблон /var/log/nginx/*.log:
- missingok — говорит о том, что если файла нету то все ок
- daily — проводить ротацию ежедневно
- rotate X — хранить X файлов
- compress — сжимать старые файлы
- delaycompress — не сжимать последний лог
- notifempty — не архивировать пустые файлы
- create ACCESS_MODE USER GROUP — с какими правами создавать архивы
- sharedscripts — какая то фишка для prerotate и postrotate:)
- prerotate, postrotate — что сделать перед ротацией и после нее.
Что меня побудило написать эту статью? Написать эту статью я решил потому что обнаружил то, что на моих серверах которые я админю логи apache и nginx внезапно стали помещаться в домашнюю директорию пользователя, и имели различные размеры (от пары мегабайт до нескольких гигов), и конечно же ротация логов не была перенастроена, и так вот логами было съедено приличный объем дискового пространства.
Мораль сей басни такова: работает — не трогай, блядь, и все будет работать отлично! А если хочется потрогать — ССЗБ 🙂
Работа с Logrotate
После запуска Rails-приложений полезно настроить автоматическую архивацию (ротацию) файлов журналов (лог-файлов), так как они имеют обыкновение крайне быстро разрастаться до весьма объемных размеров:
Найти что-либо в 200-мегабайтном файле не очень просто 😉
Для ротации логов можно использовать стандартный интструмент logrotate. Если его нет в системе, то в случае Debian или Ubuntu его можно просто установить командой:
В планировщике задач (cron) ежедневно выполняется запуск logrotate /usr/sbin/logrotate /etc/logrotate.conf с указанием файла конфига. В конфиге настраиваются глобальные параметры, которые будут применяться по умолчанию, и как правило подключается директория include /etc/logrotate.d откуда будут подружатся файлы с описанием правил (секции) для конкретных лог файлов. Пример глобального конфига:
При ротации логов — текущий log-файл с которым работает программа — удаляется или перемещается, поэтому после ротации лога, будет правильным перезапустить программу/сервис, чей log-файл был удален. Нужно это, что бы программе был сообщен новый дискриптор файла. Хотя это ситуация может разрулится автоматически и без перезагрузки — если такую ситуацию предусмотрели разработчики.
Параметры настройки
Вот список всех параметров на текущий момент:
| Параметр | Описание |
|---|---|
| rotate <число> | Количество хранимых файлов |
| daily weekly monthly |
Производить ротацию раз в день/неделю/месяц |
| size <байт> size 1000 size 100k size 1M |
Производить ротацию если log-файл превысил указанный размер байт Кбайт Мбайт |
| start <число> | число с которого начнётся нумерация файлов |
| compress | Архивировать файлы (по умолчанию gzip) |
| nocompress | Отключает compress |
| delaycompress | Не сжимать ‘свеже’ созданный архив. Например access.log. не будет зжат. Используется с compress |
| create <права><владелец><группа> create root root |
После ротации создать пустой log-файл. Любые из этих атрибутов могут быть опущены, в этом случае вместо них для нового файла будут использованы атрибуты, имеющие те же значения, что и первоначальный log-файл |
| nocreate | Не создавать файл |
| copy | Создать копию оригинального log-файла, не изменяя его. Исключает create |
| nocopy | Отключает copy |
| copytruncate | Создать копию оригинального log-файла, а потом его ‘обнулить’. Таким образом сам файл не удаляется. Исключает copy, create |
| ifempty | Архивирует даже пустой файл (используется по умолчанию) |
| notifempty | Не архивировать пустые файлы |
| missingok | В случае отсутствия оригинального log-файла не вызовет ошибку |
| nomissingok | В случае отсутствия оригинального log-файла вызовет ошибку |
| postrotate <команды> endscript |
Строки, находящиеся между postrotate и endscript будут выполнены как sh скрипт после архивирования log-файла |
| prerotate <команды> endscript |
Аналогично postrotate, только действия будут выполнены до начала архивирования |
| sharedscripts | Скрипты postrotate и prerotate будут выполнены только один раз в рамках своей секции. |
| nosharedscripts | Отключает sharedscripts. Скрипты будут выполняются при ротации каждого log-файла, при определение /var/log/apache2/*.log скрипт будет выполнен столько раз сколько уникальных log-файлов будет находится в данной директории |
| olddir <путь> olddir /home/logs |
Перемещать архивные файлы в указанную директорию |
| noolddir | Отключает olddir |
| dateext | К имени файлов журналов добавляется дата (%Y%m%d), вместо номера |
| su <user> <group> | Выполняется с правами указанного пользователя. Необходимо если ошибка: «because parent directory has insecure permissions», т.е. на директорию с логами, есть право на запись кроме root’a |
Пример настройки logrotate
Создаём файл конфигурации logrotate для Rails-приложения /etc/logrotate.d/rails_example_com (настройки для нескольких приложений можно хранить в одном файле, но более правильно использовать по одному файлу на приложение). Содержание файла должно быть примерно такое:
Запуск
Параметры запуска
| Параметр | Описание |
|---|---|
| -d | debug — отладочный режим. В режиме отладки не будут производиться изменения в log-файле и файле состояния |
| -f —force |
Принудительно произвести ротацию, даже если в данный момент она не требуется |
| -m <команда> —mail <команда> |
Указать команду для отправки почты. Команда должна принимать два аргумента: тема сообщения и адрес получателя. Текст письма передается стандартным вводом (stdin). По умолчанию /usr/bin/mail -s |
| -s <файл> —state <файл> |
Указать куда записать файл состояния. Что — то типа лога, показывает последнюю дату когда производилась ротация (если создания архива не требуется правилами, то дата все ровно обновляется) По умолчанию /var/lib/logrotate/status |
Для проверки работы можно запустить logrotate с параметром -d (отладка), благодаря которому logrotate покажет, как он будет работать, но ничего не изменит:
Если logrotate в тестовом режиме отработал без ошибок, то можно ждать, когда он отработает автоматически на следующие сутки или запусить его вручную:
Также, можно второй раз вручную запустить logrotate, чтобы убедиться, что опция delaycompress работает, результатом двух запусков logrotate должно быть следующее:
- production.log — остался на месте, пуст и доступен для записи для приложения;
- production.log.1 — копия логов между первым и вторым запуском logrotate;
- production.log.2.gz — сжатый лог за всё предыдущее время.
С указанными настройками каждый день будет проходит архивация лог-файла, будут храниться логи за последние 7 дней и каждый день будет удаляться самый старый лог. Каждому архивному файлу присваивается номер, чем больше номер тем ‘старее’ архив.
Варианты настроек
В предложенном ниже файле настройки для хранения журналов за последний год с еженедельной архивацией:
Установка и настройка Logrotate в Linux
Директория /var/log – одна из наиболее интересных (и, возможно, наиболее важных) директорий в Linux. В соответствии со стандартом иерархии файловых систем, данные о работе большинства запущенных в системе служб сохраняются в файлы в этой директории или одной из ее поддиректорий.
Такие файлы называются журналами или логами, и они являются ключом к анализу работы системы (и того, как она работала раньше). Логи также являются первым источником информации для администраторов и инженеров при устранении неполадок.
Зачем нужна ротация логов
Если посмотреть содержимое /var/log в различных дистрибутивах Linux, мы увидим следующие файлы и поддиректории. У вас они могут отличаться в зависимости от запущенных в вашей системе служб и времени их работы.

Здесь мы видим, что некоторые имена логов заканчиваются на «log», как и можно предположить, а некоторые переименовываются в соответствии с датой (например, maillog-20190203) .
Если бы логи хранились вечно, в какой-то момент они бы заполнили всю файловую систему, где находится /var/log. Чтобы этого не произошло, можно воспользоваться полезной утилитой под названием logrotate для периодической очистки (ротации) логов.
Другими словами, logrotate переименовывает или сжимает файл лога при выполнении определенных условий (мы рассмотрим их чуть ниже), а следующее событие записывается в пустой файл. Кроме того, она удаляет «старые» файлы логов и сохраняет только более новые. Естественно, мы сами определяем критерии «старости» и периодичность очистки.
Установка logrotate
Для установки logrotate просто воспользуйтесь менеджером пакетов.
В Debian и Ubuntu
В CentOS, RHEL и Fedora
Сразу стоит отметить, что конфигурация хранится как в основном файле (/etc/logrotate.conf), а также в отдельных файлах .conf в директории /etc/logrotate.d. Необходимо только включить эту опцию в основном файле параметром
В дальнейших примерах мы для большей упорядоченности будем придерживаться именно этого подхода настройки logrotate.
Примеры настроек Logrotate
Logrotate – очень многофункциональный инструмент. Он располагает большим разнообразием опций для определения того, когда и как будет выполняться ротация логов и какие действия будут выполняться с ними в дальнейшем.
Вставьте в файл /etc/logrotate.d/httpd следующие строки (скорее всего, этот файл будет создан при установки):
Рассмотрим назначение каждой из них.
Первая строка показывает, что директивы в данном блоке применяются ко всем логам в директории /var/log/apache2.
weekly — означает еженедельную ротацию логов. Другие возможные значения – daily (ежедневно) и monthly (ежемесячно).
rotate 3 — задает сохранение только 3 прошедших ротацию логов. Таким образом, при четвертом запуске самый старый файл будет удален.
size=10M — устанавливает минимальный размер файла для ротации равным 10 мегабайт. Другими словами, ротация не будет выполняться, пока лог не достигнет размера в 10 Мб
compress и delaycompress — используются для того, чтобы задать сжатие всех сохраненных логов кроме самого последнего.
Проведем тестовый запуск, чтобы увидеть, что бы сделала logrotate, если бы она действительно была запущена. Воспользуйтесь опцией -d с файлом конфигурации (для реального запуска утилиты не указывайте эту опцию):
Вместо сжатия логов их можно переименовывать в соответствии с датой ротации. Для этого используется директива dateext. Для использования формата даты, отличного от ГГГГММДД можно указать желаемый формат.
Мы также можем исключить ротацию лога, если он пустой, воспользовавшись опцией notifempty. Кроме того, зададим отправку заполненных логов системному администратору по электронной почте (в данном случае admin@mydomain.com), для этого в системе должен быть настроен почтовый сервер.
В следующем примере настроим файл конфигурации /etc/logrotate.d/squid с использованием описанных выше параметров для ротации лога /var/log/squid/access.log:
Как мы видим, ротация этого лога не требуется. Однако, при выполнении условия по размеру (size=1M), лог будет переименован в access.log-25022019 (если ротация была произведена 25 февраля 2019 года), и будет создан новый файл access.log с правами доступа 0644, и владельцем root. Когда наберется 6 логов, самый старый из них будет отправлен на admin@mydomain.com.
Теперь допустим, что при выполнении ротации вам требуется запуск собственной команды. Для этого пропишите строку с этой командой между директивами postrotate и endscript. Например, если требуется уведомлять root-пользователя по электронной почте о каждой ротации логов в директории /var/log/myservicegets, добавьте в блок три последних строки:
Важно помнить, что в случае конфликтов параметры в файлах конфигурации, расположенных в директории /etc/logrotate, имеют приоритет перед параметрами в основном файле конфигурации.
Logrotate и Cron
По умолчанию после установки logrotate в директории /etc/cron.daily создается файл crontab с именем logrotate. Как и в случае с другими файлами crontab в этой директории, он будет выполняться ежедневно в соответствиями с настройками в /etc/crontab.
Заключение
В системе, где ведется множество логов, их администрирование может быть существенно упрощено при помощи logrotate. Как было рассмотрено в данном руководстве, данная утилита будет автоматически выполнять ротацию, сжимать, удалять логи и отправлять их по электронной почте с заданной периодичностью или при достижении файлом определенного размера. Просто убедитесь, что для запуска logrotate есть соответствующая задача cron, и все станет гораздо проще. Для более подробной информации обратитесь к соответствующей man-странице.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Настройка Logrotate
В Linux, большинство сервисов и программ, которые работают в фоне, таких как Apache, Nginx, Postfix и других записывают информацию о своем состоянии, результатах работы и ошибках в лог файлы. Стандартное расположение логов или как их еще называют — журналов — в папке /var/log.
С помощью анализа логов вы можете понять что работает не так, почему произошла ошибка и как решить возникшую проблему. Но тот кроется одна проблема. Размер логов постоянно растет и они занимают все больше и больше места на диске, поэтому необходимо вовремя чистить логи и удалять устаревшие записи, чтобы они не мешали нормально работать. Это можно делать вручную время от времени или настроить скрипты Cron, но есть еще более простой вариант — утилита logrotate. В этой статье будет рассмотрена настройка logrotate и ее использование.
Как работает Logrotate?
Утилита Logrotate предназначена для автоматизации обработки журналов. Она может выполнять с ними необходимые действия в зависимости от определенных условий и правил соответствия. Например, можно сжимать журналы в архив или отправлять на другой сервер когда они достигают определенного размера, возраста, или других параметров.
Проверку условий можно настроить ежедневно, еженедельно или ежемесячно. Это позволяет создать схему ротации логов, удобную именно для вас и вашего сервера. Также ротация логов может быть полезна на домашнем компьютере, но здесь она не так важна как на серверах, где только в логи Apache могут записываться до сотен тысяч строк ежедневно.
Настройка Logrotate
Logrotate — это популярная утилита, поэтому в большинстве дистрибутивов она поставляется по умолчанию. Вы можете убедиться, что программа установлена в вашем дистрибутиве, попытавшись ее установить. Например, в CentOS:
sudo yum install logrotate

Или в Ubuntu и основанных на ней дистрибутивах:
sudo apt install logrotate
Теперь, даже если утилита не была установлена, вы ее установите. Все основные настройки программы находятся в файле /etc/logrotate.conf, дополнительные настройки, касаемо правил и других возможностей могут быть размещены в папке /etc/logroate.d/. Вы можете размещать все настройки logroatae прямо в основном конфигурационном файле, будет более правильно, если настройки для каждого отдельного сервиса будут находиться в отдельном файле, в папке /etc/logrotate.d/.
Чтобы конфигурационные файлы из этой папки загружались программой, необходимо добавить в основной конфигурационный файл такую строчку:

Просто убедитесь что она там уже есть. Сначала давайте рассмотрим основные директивы, которые мы будем применять во время настройки. Здесь директивы выглядят не совсем обычно, сама директива и определяет что и когда нужно делать, а уже если нужно, ей передаются дополнительные параметры. Чтобы указать как часто нужно выполнять проверку совпадению условий используются такие директивы:
- hourly — каждый час;
- daily — каждый день;
- weekly — каждую неделю;
- monthly — каждый месяц;
- yearly — каждый год.
Основные директивы управления и обработки логов:
- rotate — указывает сколько старых логов нужно хранить, в параметрах передается количество;
- create — указывает, что необходимо создать пустой лог файл после перемещения старого;
- dateext — добавляет дату ротации перед заголовком старого лога;
- compress — указывает, что лог необходимо сжимать;
- delaycompress — не сжимать последний и предпоследний журнал;
- extension — сохранять оригинальный лог файл после ротации, если у него указанное расширение;
- mail — отправлять Email после завершения ротации;
- maxage — выполнять ротацию журналов, если они старше, чем указано;
- missingok — не выдавать ошибки, если лог файла не существует;
- olddir — перемещать старые логи в отдельную папку;
- postrotate/endscript — выполнить произвольные команды после ротации;
- start — номер, с которого будет начата нумерация старых логов;
- size — размер лога, когда он будет перемещен;
Это те основные директивы, которые мы будем использовать. В главном конфигурационном файле находится глобальная конфигурация, директивы, которые будут распространяться на все логи если не было отменено их действие. Каждый лог, который подлежит ротации описывается таким образом:
Теперь давайте создадим файл rsyslog.conf в папке /etc/logrotate.d/ и поместим в него настройки для ротации этого лога:

Эти настройки означают, что ротация журналов будет выполняться ежедневно, и мы будем хранить три последних журнала, более старые копии будут автоматически удаляться. Минимальный размер для ротации — 10 мегабайт, ротация не будет выполнена, если лог не занимает более 10 мегабайт. Будет использоваться сжатие, для всех журналов кроме последнего и предпоследнего. Точно по такому же принципу вы можете настроить ротацию логов для любого из журналов. Нужно создать такую секцию для каждого из логов, которыми вы хотите управлять.
Теперь осталось протестировать как работает наша конфигурация. Для этого запустим утилиту logrotate с опцией -d. Она выведет все, что планируется сделать, но не будет изменять файлы на диске. У нас есть файл /var/log/messages, размером 40 Мегабайт, посмотрим что будет делать утилита:
logrotate -d /etc/logrotate.d/rsyslog.conf

Как видите, программа обнаруживает файл лога и разделяет его на несколько частей. Вы можете убедиться, что logrotate будет запускаться как положено проверив расписание cron:

Настройка Logrotate завершена, а вам осталось всего лишь расписать как будет выполняться ротация логов для каждого из журналов, которые занимают много места.
Выводы
В этой статье мы рассмотрели как выполняется настройка logrotate centos или в любом другом дистрибутиве Linux. Работа утилиты не сильно отличается в зависимости от дистрибутивов. Если у вас есть сервер с большой нагрузкой, вам обязательно необходимо настроить ротацию логов. Надеюсь, эта информация была полезной для вас. На завершение видео, о том как выполняется ротация логов в Ubuntu от LPIC: