Logrotate
Logrotate — это утилита командной строки для Linux и Unix-подобных систем, которая автоматизирует управление лог-файлами, выполняя их ротацию (переименование или разделение на части), сжатие, удаление или архивацию. Утилита предотвращает переполнение диска системными журналами, сохраняя только необходимые данные и гарантируя стабильность работы серверов и приложений.
Как работает Logrotate
- Ротация: При достижении заданных условий (например, по размеру файла или по времени) лог-файл переименовывается, а новый создается на его месте.
- Сжатие: Для экономии места обновленные лог-файлы могут автоматически сжиматься (например, с помощью gzip).
- Удаление/Архивация: Старые файлы журналов могут быть удалены или перенесены на другой сервер.
Конфигурация
- Основной файл конфигурации:
/etc/logrotate.confсодержит общие настройки и шаблоны для системных журналов. - Дополнительные файлы конфигурации: Файлы в каталоге
/etc/logrotate.d/используются для настройки ротации логов для конкретных приложений и сервисов, что позволяет администратору задавать индивидуальные параметры.
Основной конфигурационный файл logrotate находится в /etc/logrotate.conf.
# see "man logrotate" for details
# rotate log files weekly
weekly
# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here
Этот конфигурационный файл используется для установки глобальных настроек, таких как — от какого пользователя должна производиться ротация логов, сколько отротированных логов требуется хранить и как часто их ротировать. Кроме того, здесь приведена конфигурация для двух файлов — /var/log/btmp и /var/log/wtmp (они хранят информацию о входах в систему, ее можно просмотреть такими утилитами, как lastlog), которые можно использовать как основу для своих файлов
/var/log/myapp/debug.log {
daily # Ротировать ежедневно
missingok # Игнорировать ошибки, если файл отсутствует
rotate 7 # Хранить 7 старых файлов
compress # Сжимать ротируемые файлы
notifempty # Не ротировать пустой файл
create 0640 root adm # Создавать новый файл журнала с указанными правами
sharedscripts # Выполнять скрипты один раз для группы файлов
postrotate # Скрипт, выполняемый после ротации
systemctl reload apache2 # Пример перезагрузки сервиса Apache2
endscript
}
Правила ротации, связанные с конкретными файлами имеют бОльший приоритет, чем глобальные параметры. То есть, к примеру, если вы указали для своего файла ежедневную ротацию файлов, то logrotate будет использовтаь именно это правило, а не глобальное (в нашем случае — еженедельная ротация). В ином случае — ваши правила унаследуют глобальные.
Правила ротации, которые можно применять в конфигурации logrotate:
- compress — указывает, что требуется производить сжатие старых файлов (для сжатия используется утилита gzip по умолчанию, но возможно поменять утилиту при помощи правила compresscmd). Если же мы НЕ хотим сжимать отротированные файлы, можно использовать директиву nocompress.
- compressext — определяет, какое расширение требуется добавить к файлам после сжатия.
- compressoptions — определяет, какие параметры требуется передать утилите сжатия.
- delaycompress — указывает, что сжимать первый ротированный лог НЕ нужно (а вот второй и далее — сжимаются). Бывает полезно, если требуется быстрый доступ к предыдущему логу без использования утилит разархивации.
- extension — задает, какой суффикс будет добавлен к ротированным логам (в случае использования сжатия суффикс сжатия добавляется сразу после указанного расширения) (пример — extension rotated, тогда ротированные логи будут выглядить как log.rotated.0 и log.rotated.1, а сжатый — log.2.rotated.gz).
- create — определяет, что после ротации файла (но перед запуском postrotate) требуется создать новый файл с указанными правами доступа, его владельцем является конкретный пользователь и группа (пример — create 664 www-data www-data). В случае, если создание новых файлов НЕ требуется, можно использовать директиву nocreate.
- copy — ротированный файл будет представлять собой копию текущего файла. Может использоваться, если за очистку лога отвечает другая утилита (можно выключить это поведение директивой nocopy).
- copytruncate — производит копию файла и очищает текущий файл (почти так, как если бы вы сделали echo > $TARGET_FILE). Бывает полезно, если приложение НЕ умеет переоткрывать файл для логирования без остановки приложения (можно выключить это поведение директивой nocopytruncate). Директива copytruncate позволяет избежать случая, когда мы удалили лог, в который писало приложение, и создали новый. Это может привести к тому, что новые логи не будут писаться в новый файл, а свободное место в системе будет уменьшаться из-за того, что приложение продолжает писать в файловый дискриптор, с которым оно начало работать при старте, а значит, откроет новый файл только при перезапуске (повторимся — это в случае, если приложение не умеет переоткрывать файл без перезапуска).
- dateext — указывает, что к ротированным файлам требуется добавлять окончание с датой, формат которой задается в директиве dateformat (используется тот же формат, что и у каманды date, по умолчанию используется -%Y%m%d).
- daily — определяет, что ротацию логов требуется производить ежедневно.
- weekly — производить ротацию раз в неделю.
- monthly — производить ротацию ежемесячно в конце месяца.
- yearly — производить ротацию раз в год в то же время, когда была предыдущая ротация.
- include — указывает, из какого файла/директории подключить дополнительные правила обработки логов
- mail — оповещать по указанной почте о том, что отротированный файл был удален при превышении количества ротируемых файлов (это логика по умолчанию, как если бы была установлена директива maillast), или об имени только отротированного файла (возможно через добавление директивы mailfirst) (требует конфигурации почтового агента на хосте). Если же отправка письма не требуется, можно воспользоваться директивой nomail.
- ifempty — производить ротацию, даже если файл пустой (обратная директива - notifempty).
- missingok — если целевой файл отсутствует, не вызывать ошибку (по умолчанию выставлена директива nomissingok, которая реагирует на отсутствие логов ошибкой).
- maxage — указывает, через сколько дней хранения отротированные логи должны быть удалены (может быть актуально, если логи пишутся небыстро и хранение не имеет смысла) (пример — maxage 7).
- minsize — указывает, какого минимального объема должен быть лог, чтобы logrotate произвел ротацию файла по указанному правилу (скажем, если ротация производится еженедельно, то будет ожидаться необходимый день ротации, чтобы произвести проверку объема файла). Размер указывается в байтах.
- olddir — указывает, в какой директории должны храниться старые логи (переопределение этой опции возможно при помощи noolddir).
- size — определяет, при превышении какого объема требуется ротировать файл (можно использовать приставки k,M,G для указания, что объем файла в кило-, мега- или гигабайтах).
- start — определяет, с какого числа начинать нумеровать ротированные логи (по умолчанию - 0).
- rotate — определяет, сколько ротированных логов требуется оставить.
- prerotate/endscript — определяет, какой скрипт должен быть запущен до ротации лога. Важно то, что скрипт должен быть расположен в строке между prerotate и endscript.
- postrotate/endscript — аналогично, но действие производится после ротации лога.
- firstaction/endscript — определяет, какой скрипт должен быть разово запущен перед ротацией файлов, указанных через wildcard.
- lastaction/endscript — аналогично, но действие производится после ротации логов, попадающих под wildcard.
- sharedscripts — указывает, что скрипты из prerotate и postrotate должны запускаться только один раз в случае, если было отротировано более одного файла (возможно отметить данный скрипт при помощи директивы nosharedscripts).
Logrotate запускается по расписания с помощью Cron