logrotate - утилита для архивации log-файлов
Осуществляет автоматическую архивацию (ротацию) log-файлов.
Описание
В планировщике задач (cron) ежедневно выполняется запуск logrotate
/usr/sbin/logrotate /etc/logrotate.conf
с указанием файла конфига
В конфиге настраиваются глобальные параметры, которые будут применяться по умолчанию, и как правило подключается директория
include /etc/logrotate.dоткуда будут подружатся файлы с описанием правил (секции) для конкретных лог файлов.
При ротации логов - текущий log-файл с которым работает программа - удаляется или перемещается, поэтому после ротации лога, будет правильным перезапустить программу/сервис, чей log-файл был удален. Нужно это, что бы программе был сообщен новый дискриптор файла. Хотя это ситуация может разрулится автоматически и без перезагрузки - если такую ситуацию предусмотрели разработчики.
Каждому архивному файлу присваивается номер, чем больше номер тем 'старее' архив.
Параметры запуска
Параметр | Описание |
---|---|
-d | debug - отладочный режим. В режиме отладки не будут производиться изменения в log-файле и файле состояния |
-f --force | Принудительно произвести ротацию, даже если в данный момент она не требуется |
-m <команда> --mail <команда> | Указать команду для отправки почты. Команда должна принимать два аргумента: тема сообщения и адрес получателя. Текст письма передается стандартным вводом (stdin). По умолчанию /usr/bin/mail -s |
-s <файл> --state <файл> | Указать куда записать файл состояния. Что - то типа лога, показывает последнюю дату когда производилась ротация (если создания архива не требуется правилами, то дата все ровно обновляется) По умолчанию /var/lib/logrotate/status |
Настройка
Описание секции начинается с указания файлов над которыми будет производится ротация, а параметры указываются в фигурных скобах.
Можно указывать по маске:
/var/log/apache2/*.log { ... }или конкретные файлы
/var/log/apache2/access.log /var/log/apache2/error.log { ... }
Ротацию можно производить по расписанию (ежедневно, еженедельно …) или по достижению определенного размера log-файлом - это взаимоисключающие параметры.
Параметр | Описание |
---|---|
rotate <число> | Количество старых файлов, которые нужно хранить |
hourly daily weekly monthly yearly | Как часто производить ротацию, раз в час, день, неделю, месяц, год. До версии 3.8.1 несовместим с size |
size <байт> size 1000 size 100k size 1M | Производить ротацию если log-файл превысил указанный размер. До версии 3.8.1 несовместим с hourly, daily, weekly, monthly, yearly |
start <число> | число с которого начнётся нумерация файлов |
compress | Архивировать файлы (по умолчанию gzip) |
nocompress | Отключает: compress |
delaycompress | Не сжимать 'свеже' созданный архив. Например access.log.1 не будет зжат. Зависимость: compress Несовместимость: nocompress |
create <права><владелец><группа> create 640 root root | После ротации создать пустой log-файл. Любые из этих атрибутов могут быть опущены, в этом случае вместо них для нового файла будут использованы атрибуты, имеющие те же значения, что и первоначальный log-файл |
nocreate | Не создавать пустой файл после ротации. Отключает: create |
copy | Создать копию оригинального log-файла, не изменяя его. Несовместимость: create |
nocopy | Отключает: copy |
copytruncate | Создать копию оригинального log-файла, а потом его 'обнулить'. Таким образом сам файл не удаляется и не меняется его дескриптор. Несовместимость: create |
ifempty | Архивирует даже пустой файл (используется по умолчанию) |
notifempty | Не архивировать пустые файлы. Отключает: ifempty Несовместимость: size |
missingok | В случае отсутствия оригинального log-файла не вызовет ошибку |
nomissingok | В случае отсутствия оригинального log-файла вызовет ошибку. Отключает: missingok |
postrotate <команды> endscript | Строки, находящиеся между postrotate и endscript будут выполнены как sh скрипт после архивирования log-файла |
prerotate <команды> endscript | Аналогично postrotate, только действия будут выполнены до начала архивирования |
sharedscripts | Скрипты postrotate и prerotate будут выполнены только один раз в рамках своей секции. |
nosharedscripts | Отключает sharedscripts. Скрипты будут выполняются при ротации каждого log-файла, при определение /var/log/apache2/*.log скрипт будет выполнен столько раз сколько уникальных log-файлов будет находится в данной директории |
olddir <путь> | Перемещать архивные файлы в указанную директорию |
noolddir | Отключает olddir |
dateext | К имени файлов журналов добавляется дата (%Y%m%d), вместо номера |
su <user> <group> | Выполняется с правами указанного пользователя. Необходимо если ошибка: «because parent directory has insecure permissions», т.е. на директорию с логами, есть право на запись кроме root'a |
mail <mail@domain.com> | Отправляет ротированные логи на почту. Локально должна быть настроена MTA sendmail или т.п. |
nomail | Отключает mail |
Пример
Глобальный конфиг
/etc/logrotate.conf
create compress include /etc/logrotate.d
Ротация логов Апача
/etc/logrotate.d/apache2
/var/log/apache2/*.log { weekly missingok rotate 52 compress delaycompress notifempty create 640 root adm sharedscripts postrotate # Скрипт на перезагрузку Апача if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then /etc/init.d/apache2 reload > /dev/null fi endscript }
Обсуждение
премного благодарю, очень здорово расписано и очень помогло!
Хороший материал
Спасибо! за хороший материал
olddir не перемещает лог на другой физический диск, будьте внимательны, пришлось столкнуться с этим
а как указать для использования другого архиватора вместо gzip
Да классно описано, только я не понял, а можно ли ежедневно переименовывать например файл error.log в error_YYYY-MM-DD.log, где YYYY - год, MM - месяц, DD - день? ну и для access.log тоже самое
dateext К имени файлов журналов добавляется дата (%Y%m%d), вместо номера