Атоматическая ротация логов с помощью утилиты logrotate

Некоторое время назад настроил на своем VPS один скрипт который периодически выводит некоторую информацию из логов на существующий сайт… Что за скрипт и из каких именно журналов он читает информацию я расписывать не буду — это не суть важно. Зато важно то что через некоторое время сервер начал жесточайшим образом уходить в своп и как следствие заметно тормозить. Оказалось что файл журнала (тот из которого читалась информация) разрастался до многомегабайтных размеров а скрипт отъедал заметные ресурсы ресурсы то и дело считывая из него информацию…

Таким образом мне пришлось настраивать logrotate в Линукс…

Чаще всего разработчики той или иной программы под Linux сами заботятся о том чтобы лог-файлы создаваемые их программой сами чистили и архивировали свои журналы ежедневно (либо еженедельно/ежемесячно либо в зависимости от размеров этих лог-файлов). И делают это обычно настройкой logrotate для своей программы.

Делается это для того чтобы логи не разрастались до гигабайтных размеров и не забивали собой дисковое пространство. Ведь чаще всего необходимость рыться в журналах приходит в ближайшие часы или дни или максимум недели после некой поломки или проблемы. И кстати как видно из моего примера иногда большие размеры файлов могут не только занимать место на диске но и вызывать торможение всей системы.

Таким образом для этих целей и придумана утилита logrotate. Как вероятно сразу же понятно из названия служит она для того чтобы ротировать логи. Работает это так что при определенных в конфигурационных файлах условиях (например время или размер файла) файлы журналов для которых эти условия прописаны архивируются и журнал начинает писаться уже в новый файл. Также можно указывать количество хранимых архивов логов после достижения которого старые файлы будут просто удаляться. При желании можно даже отправлять логи на почту…

Практически во всех готовых дистрибутивах logrotate уже установлен и включен если же нет то он точно доступен в основном репозитории.

Чаще всего первичные настройки уже храняться в файле /etc/logrotate.conf. Также могут присутствовать специальные настройки для конкретных программ в директории /etc/logrotate.d/. Для того чтобы файлы из этой папки подхвативались утилитой logrotate в основном файле должна иметься строчка:

include /etc/logrotate.d

Она указывает что файлы из этой директории как бы прикрепляются к основному файлу настроек (так сказать «инклюдятся»). Такой подход позволяет не лезть каждый раз в главный файл конфигурации и не выискивать там директивы для нужной программы среди множества других а просто открывать нужный файл для нее и редактировать. Чтобы создать настройки для той или иной программы нужно создать файл в этой директории а чтобы отменить ротацию логов для конкретной программы стоит всего лишь удалить файл (ну или сделать его недоступным для чтения).

Пример файла /etc/logrotate.conf:

# Запускаем ротацию еженедельно  weekly # Оставляем три последних файла жирналов  rotate 3 # Создаеем новый файл вместо архивированного  create # Используем сжатие для устаревшего лог-файла  compress # Подключаем файлы из указанной директории  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/programma где programma - имя программы для журналов которой нужно произвести настройки:

/var/log/programma/*.log {#запускать ежедневно#daily#выполнять только если размер файла больше 1Мб#minsize=1M#сжимать ротируемый файлcompress#сжимать предыдущий файл при следующей ротацииdelaycompress#кол-во хранимых сжатых фрагментовrotate 5#максимальный размер несжатого файлаsize=999k#отсутствие файла не является ошибкойmissingok#не обрабатывать пустые файлыnotifempty#сразу после ротации создать пустой файл с заданными правами и пользователем#create 644 programma_user programma_group#После создания копии обрезать исходный файл журнала взамен перемещения старого файла журнала и создания нового#При использовании этого параметра не имеет силы директива create так как старый файл журнала остаётся на своём местеcopytruncate#что делать после ротации?postrotatechown programma_user:programma_group /var/log/programma/endscript}

Опции утилиты logrotate:

-d — (debug) активирует режим отладки в котором включена также и опция -v; однако в режиме отладки файлы системных сообщений а также файл состояния logrotate не подвергаются изменениям со стороны утилиты.

-v — (verbose) активирует режим вывода подробной информации о каждом действии утилиты.

-f — (force) принуждает logrotate произвести обращение журналов даже если сама утилита не считает это необходимым. Иногда это полезно после добавления новых записей в logrotate или если старый файл журнала был удалён вручную; таким образом будут созданы новые файлы и журналирование будет корректно продолжено.

-m  — (mail) указывает утилите какую команду использовать для отправки журналов по электронной почте. Эта команда может принять два аргумента: тема письма и получатель. Команда должна читать сообщение со стандартного входа и отсылать его электронной почтой получателю. Командой по умолчанию является /bin/mail -s.

-s  — (state) предписывает утилите использовать альтернативный файл состояния. Это полезно если logrotate запускается от имени разных пользователей для разных наборов файлов системных сообщений. Файл состояния по умолчанию — /var/lib/logrotate/status.

-? — выводит краткую справку.

--usage — выводит информацию об использовании.

Далее представлена информация о директивах которые могут быть указаны в конфигурационном файле logrotate (отсюда):

compress
Старые версии файлов журналов будут сжаты (по умолчанию gzip). См. также nocompress.

compresscmd
Позволяет указать команду для сжатия файлов журналов. По умолчанию gzip. См. также compress.

uncompresscmd
Директива позволяет указать команду для декомпрессии файлов журналов. По умолчанию gunzip.

compressext
Если используется сжатие определяет расширение сжатых файлов журналов. По умолчанию определяется из настроек команды сжатия.

compressoptions
Программе сжатия может быть передана опция командной строки если та их использует. Стандартно для gzip применяется "-9" (максимальное сжатие).

copy
Создать копию файла журнала не изменяя оригинал вовсе. Этот параметр может быть использован например для создания моментального снимка (среза) текущего файла журнала или когда некоторой другой утилите требуется обрезать или подчистить файл. При использовании этого параметра не имеет силы директива create так как старый файл журнала остаётся на своём месте.

copytruncate
После создания копии обрезать исходный файл журнала взамен перемещения старого файла журнала и создания нового. Это может найти применение в том случае когда некоторой программе нельзя указать закрыть её журнал и таким образом можно постоянно продолжать запись (добавление) в существующий файл журнала. Примите во внимание что хотя между копированием файла и его обрезанием очень маленький промежуток времени некоторая часть журналируемых данных может быть потеряна. При использовании этого параметра не имеет силы директива create так как старый файл журнала остаётся на своём месте.

create режим владелец группа
Непосредственно после обращения (перед выполнением скрипта postrotate) создать файл журнала (с тем же именем что и только что сдвинутый журнал). Аргумент режим определяет режим доступа к файлу журнала в восьмеричном виде (единообразный с chmod(2)) владелец определяет имя пользователя владеющего создаваемым файлом журнала и группа определяет группу к которой будет принадлежать файл журнала. Любые из этих атрибутов могут быть опущены; в этом случае вместо них для нового файла будут использованы атрибуты имеющие те же значения что и первоначальный файл журнала. Этот параметр может быть отключен использованием директивы nocreate.

daily
Ежедневное обращение файлов журналов.

delaycompress
Отложить сжатие предыдущего файла журнала до следующего циклического сдвига. Эта директива имеет силу только в комбинации с compress. Это может быть использовано в том случае если некой программе нельзя указать закрыть её файл журнала и таким образом можно некоторое время продолжать запись в предыдущий файл журнала.

extension расширение
Файлы журналов после обращение получат заданное расширение. Если используется сжатие то после указанного расширения программа сжатия добавит ещё одно (обычно .gz).

ifempty
Сдвигать файл журнала даже если он пустой; это поведение можно изменить применив директиву notifempty (по умолчанию активна ifempty).

include файл_или_каталог
Читает файл переданный в качестве аргумента так как будто он включен построчно в тело конфигурационного файла с того места где указана директива include. Если задан каталог то содержащиеся в нём файлы будут прочитаны в алфавитном порядке прежде чем переданы на обработку для включения. Файлы не являющиеся обычными (такие как каталоги и именованные каналы) а также файлы оканчивающиеся запрещёнными расширениями (определёнными параметром tabooext) -- будут проигнорированы. Директива include не может использоваться внутри определения файла журнала.

mail адрес
По окончании цикла обращения журнал будет отправлен электронной почтой на адрес. Если для отдельных журналов это не требуется то можно применить директиву nomail.

mailfirst
При использовании команды mail посылать только что сдвинутый файл а не закончивший цикл обращения файл журнала.

maillast
При использовании команды mail посылать не только что сдвинутый файл а закончивший цикл обращения файл журнала (это задано по умолчанию).

missingok
В случае отсутствия файла журнала перейти к обработке следующего не выдавая сообщения об ошибке. См. также nomissingok.

monthly
logrotate будет сдвигать файлы журналов раз в месяц (обычно первого числа каждого месяца).

nocompress
Не сжимать с помощью gzip старые версии файлов журналов. См. также compress.

nocopy
Не копировать исходный файл журнала и оставить его в штатном местоположении (это переопределяет параметр copy).

nocopytruncate
После создания копии не обрезать исходный файл журнала в его штатном местоположении (это переопределяет параметр copytruncate).

nocreate
Не создавать новый файл журнала (это переопределяет директиву create).

nodelaycompress
Не откладывать сжатие сдвинутого файла журнала до следующего цикла обращения (это переопределяет директиву delaycompress).

nomail
Не отправлять старые файлы журналов почтой.

nomissingok
Если файл журнала не существует выдать ошибку. Это установлено по умолчанию.

noolddir
После обращения журналы остаются в том же каталоге где расположены текущие журналы (это переопределяет директиву olddir).

nosharedscripts
Выполнять скрипты prerotate и postrotate для каждого обработанного журнала (это поведение задано по умолчанию его можно переопределить параметром sharedscripts).

notifempty
Не сдвигать журнал если он пуст (это переопределяет параметр ifempty).

olddir directory
Переместить сдвинутые журналы в каталог. Заданный каталог должен размещаться на том же физическом устройстве что и обращаемый файл журнала. При использовании этого параметра все старые версии журнала будут попадать в каталог. Этот параметр может быть переопределён параметром noolddir.

postrotate/endscript
Строки с директивами находящиеся между postrotate и endscript (которые сами должны располагаться на отдельных строках) будут выполнены после обращения журнала. Эти директивы могут находиться только внутри определения файла журнала. См. также prerotate.

prerotate/endscript
Строки с директивами находящиеся между prerotate и endscript (которые сами должны располагаться на отдельных строках) будут выполнены перед обращением журнала и только в случае если журнал действительно будет сдвинут. Эти директивы могут находиться только внутри определения файла журнала. См. также postrotate.

rotate раз
Файл журнала будет сдвинут заданное количество раз прежде чем будет удалён или послан по электронной почте на адрес указанный в директиве mail. Если указано 0 раз то старый журнал вместо обращения будет удалён.

size размер
Файлы журналов будут сдвинуты когда станут больше указанного размера в байтах. Если размер оканчивается символом M то размер интерпретируется в мегабайтах. Если использовать k то можно задать размер в килобайтах. Таким образом директивы size 100 size 100k и size 100M являются верными.

sharedscripts
Обычно скрипты prescript и postscript выполняются для каждого обрабатываемого журнала; это значит что один и то же скрипт может выполняться несколько раз для одной конфигурационной записи которая охватывает множество файлов (как в примере /var/log/news/*). Если параметр sharedscript указан то скрипты будут выполнены только один раз вне зависимости от количества журналов подходящих под заданный шаблон. Однако если ни один из журналов соответствующих шаблону не требует обращения то скрипты не будут выполнены вовсе. Этот параметр переопределяет директиву nosharedscripts.

start число
Заданное число -- то с которого начнётся счёт обращений. Например если указать 0 после первого обращения (сдвига оригинального файла журнала) журналам будет присвоено расширение .0. Если указать 9 файлы журналов будут создаваться с расширением .9 пропустив 0-8. Файлы по-прежнему будут обращаться (сдвигаться) столько раз сколько указано в директиве count.

tabooext [+] список_расширений
Изменяет текущий список запрещённых расширений (см. include). Если списку расширений предшествует знак + то этот список прибавится к текущему иначе заместит его. При первоначальном запуске список содержит следующие расширения: .rpmorig .rpmsave v .swp .rpmnew и ~.

weekly
Файлы журналов будут сдвинуты если текущий день недели меньше дня недели в который произошло последнее обращение журнала или если с тех пор прошло больше недели. Это почти то же самое что и обращение журналов по понедельникам но работает лучше если logrotate не запускается каждую ночь.

PS: После внесения изменений для их применения рекомендуется выполнить в терминале от имени суперпользователя:

sudo logrotate -f -v /etc/logrotate.conf

Оригинал статьи http://pingvinoff.net/2015/01/03/avtorotacia-logov-logrotate/

0 комментариев

Оставить комментарий