Как настроить ротацию логов

Ротация логов в Linux и FreeBSD с помощью logrotate

С помощью утилиты logrotate можно настроить автоматическое удаление (чистку) лог-файлов. В противном случае, некоторые логи могут заполнить все дисковое пространство, что приведет к проблемам в работе операционной системы.

Установка

Чаще всего, в Linux данная утилита установлена по умолчанию. Если это не так, установка выполняется следующими командами.

Ubuntu / Debian:

apt-get install logrotate

CentOS / Red Hat:

yum install logrotate

FreeBSD:

pkg install logrotate

Утилита не работает как служба, поэтому нет необходимости в ее запуске или перезагрузке (logrotate start или logrotate restart делать не нужно).

Настройка

Для приложение, ротация логов настраивается в отдельных файлах, расположенных по пути /etc/logrotate.d/ (во FreeBSD — /usr/local/etc/logrotate.d/).

К примеру, нам необходимо настроить ротацию лога для logstash-forwarder. Создаем файл со следующим содержимым:

/var/log/logstash-forwarder/* <
rotate 30
size=10M
missingok
notifempty
daily
compress
delaycompress
maxage 30
create 0644 root root
postrotate
/usr/bin/systemctl restart logstash-forwarder
endscript
>

  • rotate 30 — хранить последние 30 ротированных файлов. Остальные удалять.
  • size=10M — пока размер лог-файла не превысит 10 мегабайт, он не будет ротироваться.
  • missingok — если файла не существует, не выкидывать ошибку.
  • notifempty — если файл пустой, не выполнять никаких действий.
  • daily — делать ротацию каждый день.
  • compress — сжимать ротированные файлы.
  • delaycompress — сжимать только предыдущий журнал. Позволяет избежать ошибок, связанных с отсутствием доступа к используемому файлу.
  • maxage 30 — хранить ротированные файлы за последние 30 дней. Остальные удалять.
  • create 0644 root root — создать новый лог-файл после ротирования.
  • postrotate . endscript — скрипт, который необходимо выполнить после чистки лога.

* /var/log/logstash-forwarder/* — путь к файлу, который нужно ротировать. * указывает, что нужно чистить все файлы, которые расположены в каталоге /var/log/logstash-forwarder.
* напомню, что во FreeBSD, путь будет /usr/local/etc/logrotate.d/logstash.

При настройке необходимо проверять работу сервиса после ротации лога. Некоторые службы могут перестать работать без лог-файла. В данном случае, необходимо создавать новый (create). Также, в некоторых случаях, сервис необходимо перезапускать, так как при создании нового файла меняется его дескриптор.

Запуск вручную

Запуск выполняется со следующим синтаксисом:

logrotate -f /etc/logrotate.d/logstash

Автоматический запуск

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

Если для какого-то приложения необходимо выполнять ротацию лога по особому расписанию, узнаем полный путь до утилиты logrotate:

* в моем случае, это было /usr/sbin/logrotate.

Получив путь, создаем правило в cron:

0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/logstash

* в данном примере в 00:00 будет запускаться logrotate и чистить логи с нашей настройкой для logstash-forwarder.

Источник

Установка и настройка 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 + доступ для сбора логов по SFTP

У меня стояла задача: настроить сжатие логов DNS сервера Unbound, с возможностью удобного сбора этих бэкапов в коллектор. Также требовалось ограничить права доступа, чтобы с коллектора можно было зайти только в дирректорию, где хранятся бэкапы логов. Указанные действия проводил на CentOS 7 Minimal и CentOS 6.6 Minimal.

1) Сперва создаем группу пользователей, для которой будет ограничен доступ только по SFTP:

2) Далее правим конфигурацию ssh:

Требуется в самом конце закомментировать строку #Subsystem sftp /usr/libexec/openssh/sftp-server и ограничить доступ для группы пользователей sftpd только по SFTP и только в домашнюю директорию. Для этого нужно добавить в конце следующие строки:

3) Создаем пользователя dnslog, назначаем ему домашнюю папку и права на эту папку. Владелец должен быть root, никто другой не должен иметь прав на запись в эту папку, иначе ничего не получится:

4) Создаем папку, внутри домашней директории нашего пользователя, для которой у logrotate будут права на запись.

Доступ для коллектора организован, теперь можно подключиться по SFTP и проверить, что все работает. Далее настроим ротацию логов:

5) Создаем в папке /etc/logrotate.d/ файл, в котором будут прописаны настройки ротации наших логов.

Настройки примерно такие:

Далее я установил время ротации через крон.

6) В файле /etc/crontab добавил следующую строку:

23 * * * * root run-parts /etc/cron.hourly

И перезагружаем крон:

Ротация будет осуществляться каждый час в 23 минуты.

7) В папке /etc/cron.hourly/ создаем файл с любым именем, где пишем скрипт, который будет выполняться при наступлении времени ротации, с таким содержимым:

Вот и все. Логи будут автоматически складываться в папку /home/dnslog/logs/

Проверить настройки ротации можно командой:

Также, стоит отметить, что в Unbound существует два способа ведения логов: средствами Unbound и через syslog. Через syslog — лучший способ, так как не так тормозит работу Unbound. В указанном примере описана ротация логов средствами Unbound. Чтобы настроить логгирование через syslog, в конфигурации Unbound нужно включить параметр:

Источник

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

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

Читайте также:  Ноутбук леново настроить цвета

Это будет короткая заметка про конкретную настройку. Подробно описывать работу logrotate не буду, так как в интернете и так полно материала на эту тему.

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

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

Для того, чтобы защитить сервер от заполнения всего свободного пространства диска логами access.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, по достижении определенного размера, вам нужно:

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

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

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

Источник

Оцените статью