- Автор темы
- Администратор
- Модер.
- Команда форума
- #1
С помощью утилиты logrotate можно настроить автоматическое удаление (чистку) лог-файлов. В противном случае, некоторые логи могут заполнить все дисковое пространство, что приведет к проблемам в работе операционной системы.
Чаще всего, в Linux данная утилита установлена по умолчанию. Если это не так, установка выполняется следующими командами.
Ubuntu / Debian:
CentOS / Red Hat:
FreeBSD:
Утилита не работает как служба, поэтому нет необходимости в ее запуске или перезагрузке (logrotate start или logrotate restart делать не нужно).
Для приложение, ротация логов настраивается в отдельных файлах, расположенных по пути /etc/logrotate.d/ (во FreeBSD — /usr/local/etc/logrotate.d/).
К примеру, нам необходимо настроить ротацию лога для logstash-forwarder. Создаем файл со следующим содержимым:
vi /etc/logrotate.d/logstash
* /var/log/logstash-forwarder/* — путь к файлу, который нужно ротировать. * указывает, что нужно чистить все файлы, которые расположены в каталоге /var/log/logstash-forwarder.
** имейте в виду, что во FreeBSD, путь может быть /usr/local/etc/logrotate.d/logstash.
При настройке необходимо проверять работу сервиса после ротации лога. Некоторые службы могут перестать работать без лог-файла. В данном случае, необходимо создавать новый (create). Также, в некоторых случаях, сервис необходимо перезапускать, так как при создании нового файла меняется его дескриптор.
Для описания ротации мы можем использовать следующие директивы:
logrotate -f <путь к файлу конфигурации>
Например:
Задание на автоматический запуск создается по умолчанию в файле /etc/cron.daily/logrotate. Если изучить его содержимое, мы увидим, что идет запуск logrotate, который читает все файлы в директории /etc/logrotate.d/ и выполняющий для каждого из них ротацию.
Если для какого-то приложения необходимо выполнять ротацию лога по особому расписанию, узнаем полный путь до утилиты logrotate:
* в моем случае, это было /usr/sbin/logrotate.
Получив путь, создаем правило в cron:
* в данном примере в 00:00 будет запускаться logrotate и чистить логи с нашей настройкой для logstash-forwarder.
или запуск чистки всех логов:
Установка
Чаще всего, в 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. Создаем файл со следующим содержимым:
vi /etc/logrotate.d/logstash
Код:
/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
}
* /var/log/logstash-forwarder/* — путь к файлу, который нужно ротировать. * указывает, что нужно чистить все файлы, которые расположены в каталоге /var/log/logstash-forwarder.
** имейте в виду, что во FreeBSD, путь может быть /usr/local/etc/logrotate.d/logstash.
При настройке необходимо проверять работу сервиса после ротации лога. Некоторые службы могут перестать работать без лог-файла. В данном случае, необходимо создавать новый (create). Также, в некоторых случаях, сервис необходимо перезапускать, так как при создании нового файла меняется его дескриптор.
Описание опций
Для описания ротации мы можем использовать следующие директивы:
Параметр | Описание |
---|---|
rotate N | Хранить последние N ротированных файлов. Остальные удалять. |
maxage N | Хранить ротированные файлы за последние N дней. Остальные удалять. |
copytruncate | Сначала создается копия файла лога, после уже обрезается действующий. Это может понадобиться в случаях, когда программа должна писать лог непрерывно. Но существует 2 очевидных минуса: долгое выполнение при больших объемах и возможность потерять небольшое число записей, если из запись придется на процесс усечения. |
size=xM | Пока размер лог-файла не превысит x мегабайт, он не будет ротироваться. |
missingok | Если файла не существует, не выкидывать ошибку. |
notifempty | Если файл пустой, не выполнять никаких действий. |
daily | Делать ротацию каждый день. |
weekly | Делать ротацию каждую неделю. |
monthly | Делать ротацию каждый месяц. |
compress | Сжимать ротированные файлы. |
delaycompress | Сжимать только предыдущий журнал. Позволяет избежать ошибок, связанных с отсутствием доступа к используемому файлу. |
create 0644 root root | Создать новый лог-файл после ротирования с конкретными правами 0644 и владельцем root (меняем значения на нужные). Можно указать без прав (просто create), тогда права будут назначены по умолчанию для пользователя, под которым запускается ротация. |
su root root | Под какими пользователем и группой выполнять ротацию. В данном примере root (необходимо поменять на нужные). |
prerotate ... endscript | Скрипт, который необходимо выполнить перед чисткой лога. |
postrotate ... endscript | Скрипт, который необходимо выполнить после чистки лога. |
sharedscripts | Если мы указали выполнить ротацию для нескольких файлов (например, при помощи *), скрипт prerotate/postrotate будет выполняться для каждого из них. Данная опция указывает, что скрипт нужно выполнить один раз после завершения ротации всех файлов. |
Запуск
Мы можем разово запустить ротацию, а также настроить автозапуск.Вручную
Запуск выполняется со следующим синтаксисом:logrotate -f <путь к файлу конфигурации>
Например:
Код:
logrotate -f /etc/logrotate.d/logstash
Автоматический
Задание на автоматический запуск создается по умолчанию в файле /etc/cron.daily/logrotate. Если изучить его содержимое, мы увидим, что идет запуск logrotate, который читает все файлы в директории /etc/logrotate.d/ и выполняющий для каждого из них ротацию.
Если для какого-то приложения необходимо выполнять ротацию лога по особому расписанию, узнаем полный путь до утилиты logrotate:
Код:
which logrotate
* в моем случае, это было /usr/sbin/logrotate.
Получив путь, создаем правило в cron:
Код:
crontab -e
Код:
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/logstash
* в данном примере в 00:00 будет запускаться logrotate и чистить логи с нашей настройкой для logstash-forwarder.
или запуск чистки всех логов:
Код:
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.conf