logrotate - это программа ротации логов, позволяющая сохранять в отдельный файл логи за определенный период времени или разделить лог на части определенного размера. Logrotate позволяет очень гибко работать с логами, имея при этом простые и понятные конфигурационные файлы. Кроме этого, логи можно автоматически сжимать и информировать по почте о ротации с отсылкой свежего лога, либо последнего, который удален при последней ротации. В данный момент logrotate является самой распространенной системой ротации логов, поскольку широко используется в операционных системах на базе ядра linux, которые доминируют в сфере серверов по всему миру.
Конфигурация logrotate
Конфигурация logrotate разделена на части. Основная часть обычно хранится в файле /etc/logrotate.conf. В этом файле могут присутствовать секции для ротации логов, а также директива “include /etc/logrotate.d”, подключающая конфигурационные файлы из директории /etc/logrotate.d. Таким образом, для создания нового задания ротации вам достаточно создать конфигурационный файл и поместить его в эту директорию. Название файла желательно задавать такое же, как и название сервиса, логи которого будут ротироваться.
Вот пример конфигурационного файла /etc/logrotate.conf:
# rotate log files weekly
weekly
# 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
}
Как вы понимаете, ротироваться могут не только файлы логов, но и любые другие файлы. К примеру, можно таким образом делать ежедневные резервные копии какого-то определенного файла. Но ротация логов - это именно та основная задача, которую изначально решает программа, и решает хорошо.
Каждый файл в директории /etc/logrotate.d может включать одну или несколько секций. Каждая секция выглядит в общем виде так:
название-файла-лога {
параметры
ротации
}
Параметры ротации - это именно то, что обеспечивает гибкость ротации. У logrotate достаточно много опций, но их можно разбить на несколько групп. Вот опции, которые могут быть использованы в конфигурационных файлах:
Опции, определяющие интервал ротации:
| | |
|-|-|
|hourly
daily
weekly
monthly
yearly|Ротировать файл лога каждый час, каждый день, каждую неделю, каждый месяц, каждый год. Запуск ротации обеспечивается обычно при помощи ежедневного запуска cron (файл /etc/cron.daily/logrotate), поэтому, если вам необходимо запускать ротацию каждый час, необходимо перенастроить запуск на запуск каждый час.|
Опции сжатия логов:
| | | |-|-| |compress|Сжимать логи при ротации. По умолчанию для сжатия используется gzip| |compresscmd|Команда/программа, которая будет использоваться для сжатия логов| |compressoptions|Опции команды ротации, которые будут использоваться при сжатии логов| |uncompresscmd|Команда разархивации логов. По умолчанию gunzip| |compressext|Указать расширение файлов, которое будет указываться для сжатых логов| |delaycompress|Отложить сжатие лога до следующей ротации. Таким образом последняя версия лога после ротации будет несжатой, а более ранние - сжатыми| |nocompress|Не сжимать логи при ротации| |nodelaycompress|Не откладывать сжатие до следующей итерации ротации. Эта опция перегружает опцию delaycompress|
Опции копирования:
| | | |-|-| |copy|Копировать лог-файл, но не изменять оригинал. Эту опцию можно использовать, когда надо создать снимок лога на определенный момент, вместо ротации, либо когда для усечения лога используется внешняя программа. Если используется опция copy, то опция create, если она указана, не будет иметь никакого эффекта, так как старый лог остается.| |copytruncate|Урезать оригинальный файл до нулевого размера после создания копии вместо переименования оригинального файла и создания нового. Эта опция используется тогда, когда программе, записывающей лог, нельзя указать, что нужно закрыть связанный с файлом лога дескриптор и открыть новый. Такая программа может продолжать писать в старый файл. При использовании этой опции есть один момент, связанный с тем, что на копирование требуется некоторое время и поэтому файл не может быть скопирован мгновенно. За время копирования в лог могут быть добавлены записи, которые будут утеряны при усечении файла до нулевого размера. При использовании этой опции опция create также не будет иметь эффекта, так как старый файл остается на месте| |nocopy|Не копировать оригинальный лог-файл. Эта опция перегружает опцию copy| |nocopytruncate|Не усекать оригинальный лог-файл после создания копии. Эта опция перегружает опцию copytruncate|
Опции создания нового лог-файла (после ротации старого):
| | |
|-|-|
|create права владелец группа
create владелец группа|Указать права доступа, владельца и группу владения нового свежесоздаваемого лог-файла сразу после его создания. Как уже упоминалось, если используются опции copy и copytruncate, то create не имеет смысла, так как старый файл остается на месте, новый файл не создается. Чтобы опция create отработала, файл должен отсутствовать. Права указываются восьмеричными значениями в таком же виде, как и при использовании программы chmod. Например, 644 или 600. Если какое-то значение (права/владелец/группа) опущено, то оно будет таким же, как у оригинального файла|
|nocreate|Новые лог-файлы не создаются. Эта опция перегружает опцию create|
Опции, связанные с удалением файла лога:
| | | |-|-| |shred|Удалять лог-файл при помощи программы команды “shred -u”. По умолчанию используется unlink| |shredcycles количество|Указать количество циклов перезаписи содержимого файла до его удаления. Если опция не указана, будет использовано значение по умолчанию| |noshred|Не использовать shred для удаления| |maxage количество|Удалять файлы логов, которые старше, чем указанное количество дней. Возраст файлов проверяется только когда происходит ротация. Файлы высылаются по электронной почте на сконфигурированный адрес, если указаны опции mail и maillast|
Опции, связанные с датами:
| | | |-|-| |dateext|Использовать в названии старых лог-файлов дату вместо номера. При использовании номера названия выглядят так: logfile.1.gz, logfile.2.gz и так далее| |nodateext|Не использовать дату в названиях старых лог-файлов. Эта опция перегружает опцию dateext| |dateformat форматная-строка|Указать форматную строку для даты, которая будет добавляться к названию лога. Форматная строка похожа на используемую в команде date, но допустимы только шаблоны %Y(четырехзначный номер года), %m(двузначный номер месяца), %d(двузначный номер дня месяца) и %s(unix time, количество секунд с 00:00 01.01.1970). Значение по умолчанию “-%Y%m%d”, минус также включен в шаблон, при задании шаблона его можно упустить. Нужно отметить, что logrotate использует сортировку для определения более старых файлов, которые необходимо удалить, поэтому строка даты должна учитывать корректную сортировку. Именно поэтому вначале пишется обычно год, затем месяц и только затем день.| |dateyesterday|Использовать вчерашнюю дату при ротации. Таким образом, дата в названии файла будет соответствовать дате файла, который находится внутри архива|
Опции, связанные с рассылкой логов:
mail адрес | Указать адрес, на который будет выслан старый лог после ротации |
nomail | Не отправлять старые логи по электронной почте. |
mailfirst | Отправлять самый свежий файл после ротации |
maillast | Отправлять самый старый файл после ротации. Этот вариант используется по умолчанию |
Опции, связанные с размером и существованием файла лога:
maxsize размер | Лог ротируется, когда его размер превысит указанный, еще до наступления следующего интервала ротации (daily, weekly, monthly, yearly). Поскольку такая ротация не зависит от времени, поэтому использовать в названии файла дату не имеет смысла. |
minsize размер | Лог ротируется, когда его размер больше указанного, но не ранее, чем наступает соответствующий временной интервал ротации (daily, weekly, monthly, yearly) |
size размер | Лог ротируется, когда его размер больше указанного количества байт. Если после размера указана буква k, размер считается в килобайтах, если M - в мегабайтах, если G - в гигабайтах. Например, 1G или 10M. |
ifempty | Ротировать файл лога, даже если он пуст. Используется по умолчанию. |
notifempty | Не ротировать файл лога, если он пуст. Перегружает опцию ifempty. |
missingok | Если файл лога отсутствует, перейти к следующему без сообщения об ошибке |
nomissingok | Если файл лога отсутствует, возникнет ошибка. Этот параметр установлен по умолчанию. |
Опции, связанные с директориями, в которых хранятся логи:
olddir директория | Директория, в которую будут перемещаться логи при ротации. Эта директория должна находиться на том же устройстве, что и ротируемый файл лога. Путь к директории можно указывать как абсолютный, так и без полного пути. Во втором случае он будет считаться поддиректорией директории, в которой хранится оригинальный файл лога. Когда эта опция указана, все старые версии логов попадают в эту директорию. Опция может быть перегружена опцией noolddir |
noolddir | Логи ротируются в той же директории, где находится оригинальный файл |
Файлы настроек для logrotate позволяют выполнять скрипты в процессе ротации логов. Таким образом можно выполнить какие-то действия на каждом этапе ротации.
Опции выполнения скриптов:
postrotate/endscript | Строки, находящиеся между словами postrotate и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh после ротации файла лога. Обычно скрипту в качестве первого аргумента передается полное имя файла лога с путем. Если указана директива sharedscripts, то передается список файлов. Таким образом можно выполнить скрипт для всех файлов сразу |
prerotate/endscript | Строки, находящиеся между словами prerotate и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh перед ротацией файла лога. Обычно скрипту в качестве первого аргумента передается полное имя файла лога с путем. Если указана директива sharedscripts, то передается список файлов. |
sharedscripts | В обычном режиме скрипты выполняются по одному разу на каждый файл, указанный для ротации. Таким образом скрипты могут быть выполнены несколько раз, по разу для каждого файла, указанного для ротации. Если указана директива sharedscripts, то скрипты выполняются по одному разу, но в качестве аргументов им передается список файлов. Если же ни один файл лога не ротируется, скрипты выполнены не будут. Если в процессе выполнения скрипта возникнет ошибка, то действие не будет завершено для всех логов. |
nosharedscripts | Запускать prerotate и postrotate скрипты для каждого лога, который ротируется. Это значение по умолчанию, кроме того, эта директива перегружает sharedscripts. Скриптам передается абсолютный путь к файлам логов. Если во время выполнения скрипта возникнет ошибка, то действие не будет завершено только для одного текущего файла лога. |
preremove/endscript | Строки, находящиеся между словами preremove и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh перед удалением старого файла лога. logrotate передаст название файла, который будет удален, скрипту в качестве аргумента |
firstaction/endscript | Строки, находящиеся между словами firstaction и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh один раз до того, как лог-файлы будут ротированы и еще до того, как будет выполнена секция prerotate. Это произойдет только в том случае, если хотя бы один лог-файл будет действительно ротироваться. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет. |
lastaction/endscript | Строки, находящиеся между словами lastaction и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh один раз только после того, как лог-файлы будут ротированы и даже после того, как будет выполнена секция postrotate. Это произойдет только в том случае, если хотя бы один лог-файл ротирован. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет. |
Опции общего назначения:
extention расширение | Лог-файлы с указанным расширением могут сохранять его после ротации. Если используется компрессия, то расширение с типом архива (обычно .gz) появляется после расширения. Например, если у вас файл лога называется mylog.foo и вы хотите получить при ротации файл mylog.1.foo.gz, а не mylog.foo.1.gz |
rotate количество | Лог-файлы ротируются указанное количество раз до удаления или отправки на адрес, указанный в директиве mail. Если количество равно 0, старые версии просто удаляются вместо ротации. |
start номер | Указать номер, используемый как база для нумерации при ротации. Например, если вы указываете 0, то оригинальный файл будет ротироваться в файл с окончанием .0, и далее по увеличению, если указать 9, то нумерация начнется с .9. Файлы в любом случае будут ротироваться такое количество раз, которое указано в директиве count. |
su пользователь группа | Выполнять ротацию логов под указанным пользователем и группой вместо пользователя по умолчанию (обычно root). Если у пользователи или группы недостаточно прав для осуществления ротации, возникнет ошибка. |
include файл-или-директория | logrotate считывает указанный файл и вставляет его как есть в конфигурационный файл в место вставки директивы include. Если указана директория, файлы из нее сортируются по алфавиту и затем вставляются в конфигурацию. При этом, если файлы не являются обычными файлами, они игнорируются. Это могут быть, например, именованные пайпы или директории. Также игнорируются файлы, имеющие расширения, указанные в директории tabooext. |
tabooext [+] список | Изменение текущего списка игнорируемых расширений. Если перед списком стоит +, то текущий список дополняется указанным. Если + не указан, то список заменяется. По умолчанию список изначально включает следующие расширения: .rpmsave, .rpmorig, ~, .disabled, .dpkg-old, .dpkg-dist, .dpkg-new, .cfsaved, .ucf-old, .ucf-dist, .ucf-new, .rpmnew, .swp, .cfsaved, .rhn-cfg-tmp-* |
И напоследок простой пример.
/var/log/mydaemon/mydaemon.log /var/log/mydaemon/error.log{
# Ежедневная ротация
daily
# Начинать нумерацию с 0
start 0
# Ротировать 30 раз до удаления
rotate 30
# Не генерировать ошибку, если файла лога нет
missingok
# Удалять логи при помощи команды shred
shred
# Делать 3 цикла перезаписи
shredcycles 3
# Отложить сжатие последнего лога
delaycompress
# Выполнять postrotate только один раз
sharedscripts
# После ротации послать программе сигнал SIGHUP, в результате чего
# будут переоткрыты дескрипторы логов
# (многие программы поддерживают такое поведение)
postrotate
kill -SIGHUP $(cat /var/run/mydaemon.pid)
endscript
}
Если вы раньше не пользовались программой logrotate или пользовались, но никогда не настраивали тонко под себя, надеюсь эта информация вам поможет.