Logrotate: настройка ротации логов. Ротация логов веб-сервера Apache (и любых других логов тоже)

Как показал читательский отклик - ротация логов одна из тем, вызывающих некоторое затруднение. В частности возникают проблемы с настройкой ротации логов прокси сервера squid, что затрудняет получение отчетов за длительный период. Поэтому мы решили внести ясность и рассказать, что такое ротация логов и как ее настроить.

Все события, заслуживающие внимания, записываются системой в файлы журналов или лог-файлы, которые впоследствии можно использовать для анализа сбоев, получения статистики, расследования инцидентов и т.д. и т.п. Необходимость ведения логов, подлежащие записи события, их подробность и полнота обычно задаются в конфигурации той или иной службы и, как правило, имеют некоторые установки по умолчанию, которые подходят большинству пользователей.

Чтобы избежать бесконтрольного роста таких файлов нужен механизм ограничивающий число записей некоторым разумным пределом, это может быть размер файла, при превышении которого старые записи будут затираться, либо срок, по истечении которого записи перестанут быть актуальными и могут быть удалены. В Ubuntu Server такой механизм называется ротацией логов и реализуется с помощью системной службы logrotate .

Как следует из названия, ротация логов осуществляет периодическую замену старых логов новыми, помещая устаревшие данные в архив или просто удаляя их. В зависимости от настроек архив логов может храниться как в сжатом, так и в несжатом виде и иметь необходимую глубину.

Никаких ограничений тут нет, кроме здравого смысла и объема жесткого диска, что позволяет настроить этот процесс в полном соответствии с вашими потребностями. Так например вы можете делать ежедневную ротацию и хранить вчерашний лог в несжатом виде, а остальные в виде архивов. При каждой следующей ротации цепочка как-бы сдвигается, самый последний лог перезаписывается предпоследним, а текущий лог очищается (или создается заново).

Рассмотрим настройку ротации на примере логов прокси-сервера squid, которая вызывает у наших читателей ряд затруднений. Основные настройки ротации хранятся в /etc/logrotate.conf , кроме того отдельные службы могут иметь собственные настройки ротации, которые хранятся в специальных файлах в директории /etc/logrotate.d , настройки которых перекрывают настройки logrotate.conf .

Такой подход позволяет гибко настроить ротацию для каждой конкретной службы, не затрагивая общих настроек. Сама служба вызывается раз в сутки через планировщик cron .

Откроем файл /etc/logrotate.d/squid , у нас он имеет следующий вид:

#
#Logrotate fragnment for squid.
#
/var/log/squid/*.log {
daily
compress
delaycompress
rotate 2
missingok
nocreate
sharedscripts
prerotate
test ! -x /usr/sbin/sarg-reports || /usr/sbin/sarg-reports
endscript
postrotate
test ! -e /var/run/squid.pid || /usr/sbin/squid -k rotate
endscript
}

Разберем его структуру подробнее. Первая строка указывает путь к обрабатываемым файлам логов. В данном случае обрабатываются все файлы в директории /var/log/squid в соответствии с указанными ниже опциями:

  • daily - задает ежедневную ротацию, для еженедельной или ежемесячной используйте weekly или monthly .
  • compress - указывает сжимать архивные логи, обратная опция nocompress .
  • delaycompress - не сжимать текущий лог до следующей ротации, обычно используется в тех случаях, когда в лог происходит непрерывная запись.
  • rotate 2 - количество ротаций до удаления файла, в данном случае будут храниться два архива.
  • missingok - при отсутствии файла журнала указывает продолжить работу без вывода сообщения об ошибке.
  • nocreate - не создавать новый файл лога.
  • sharedscripts - используется для секций prerotate и postrotate , данная опция указывает исполнять скрипты из этих секций один раз перед и после ротации всех логов, в противном случае скрипты будут исполнены перед и после ротации каждого лога.

Ниже идут секции prerotate и postrotate , каждая из которых заканчивается строкой endscript , все что расположено между этих строк исполняется перед и после процесса ротации.

Секция postrotate проверяет, запущен ли squid и запускает ротацию логов самим прокси сервером. Остановимся на этом моменте немного подробнее. В конфигурационном файле squid имеется опция:

Logfile_rotate n

где n - число ротаций (по умолчанию 0), т.е. сам squid может хранить несколько ротаций логов, каждая из которых будет в свою очередь обрабатываться logrotate. При настройках по умолчанию данная команда приводит к очистке основного лога squid.

Секция prerotate добавлена автоматически при установке и в случае если файл /usr/sbin/sarg-reports существует и является исполняемым, запускает его.

Отдельно следует остановиться на записи команд, используемая в них конструкция может быть непонятна с первого раза. В данном случае используется двойное отрицание, если отрицание условия ложно, то выполняется команда указанная за символом || (логическое ИЛИ), это связано с логикой работы команды test и синтаксисом записи файла (восклицательный знак после test указывает на отрицание условия).

Как видим logrotate позволяет весьма гибко настраивать процесс ротации логов. Так если мы хотим формировать статистику использования squid помесячно, то должны указать период ротации - месяц и в секции prerotate изменить команду для формирования месячного отчета.

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

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

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

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

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

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

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

include / etc/ logrotate.d

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 # что делать после ротации? postrotate chown programma_user:programma_group / var/ log/ programma/ endscript }

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

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

Логи (или журналы) хранят в себе ценную информацию, позволяющую понять, что, когда и как происходило в системе. Логи веб-сервера - это ещё и важный источник данных для аналитики (ну, там, исследование аудитории веб-ресурса, определение основных источников трафика и прочее, хотя сегодня для подобных целей мало серверных логов, надо ещё подключать Google Analytics и Яндекс.Метрику). Но есть проблема: если на веб-ресурс ходит немало посетителей (или если система долго трудится без присмотра администратора), то логи вырастают до гигантских объемов.

Для того, чтобы однажды диск столь «самостоятельной» системы не переполнился логами под завязку и эту самую стабильную систему не завалил, надо логи периодически подчищать. Но удалять их вручную или по планировщику - плохая идея, ведь самые свежие (последние добавленные) данные из логов, как правило, действительно нужны для мониторинга системы или веб-сайта. Перед удалением надо как-то сохранять последние версии логов. Процесс сохранения нескольких копий логов с удалением самой старой при создании самой новой копии - называется ротацией. Задача типовая, а потому для ротации логов есть несколько известных инструментов, но я остановился на logrotate .

Итак, устанавливаем:
aptitude install logrotate

Итак, в новом файле мы должны описать что ротировать и как. Синтаксис чем-то похож, например, на описание виртуальных хостов nginx (и вообще такой синтаксис много где встречается). Предполагается, что лог-файлы вашего сайта лежат в /var/www/access.log и /var/www/error.log , если это нитак, то вы уж поменяйте путь в первой строке конфига.

Итак, конфигурация:

/var/www/*.log {
weekly # регулярность ротации - ротация раз в неделю, возможна иная периодичность: daily, monthly
compress # сжимать копию лога, по умолчанию для этого используется архиватор gzip, хотя можно прицепить и какой-то внешний
delaycompress # сжимать последнюю копию только при следующей ротации, это удобно, потому что самые свежие логи не придётся разархивировать
notifempty # не ротировать лог, если он пуст
missingok # не проверять наличие файла (если лога нет, то ничего страшного)
rotate 24 # количество сохраняемых копий, мне вот хватает данных и за последние полгода
mail [email protected] # отправляет свежую созданную копию на указанный e-mail, я этим не пользуюсь, но опция полезная для любителей сохранять всё ненужное на gmail`е, следите только за тем, чтоб лог пролезал в ваш ящик
create 644 root root # сразу после ротации старого создать новый пустой лог, указываются, соответственно, права доступа, юзер и группа файла
sharedscripts # запустить скрипт или утилиту после ротации всех логов
postrotate # выполнить далее указанный скрипт сразу после ротации
apache2ctl restart > /dev/null # перезапустим apache
endscript # признак окончания вызова скрипта
}

Вместо
weekly
можно было указать
size 10M
тогда лог будет ротироваться вне зависимости от регулярности, но на основе своего размера: ротироваться будет лог по объему больший или равный 10 мегабайтам. Какой вариант более подходит вам - решайте сами. Но учтите, что при регулярной ротации, вам надо хотя бы примерно прикинуть максимальный размер лога, умножить его на количество сохраняых копий и убедится, что места у вас на диске хватит и останется (иначе вся ротация смысл теряет).

Теперь давайте протестируем, удачно ли создан конфиг:
logrotate -d /etc/logrotate.d/example

С ключом -d программа будет только эмулировать полезную активность, выводя вам на экран диагностические сообщения (реально она логи не тронет).

Если всё в порядке, то запускайте утилиту в боевом режиме:
logrotate -v -f /etc/logrotate.d/example

И всё, логи будут ротироваться (руками в cron ничего добавлять не надо, всё будет сделано за вас).

В файл /var/lib/logrotate/status станет записывать информация о том, что и когда ротировал logrotate .

Logrotate — приложение, разработанное для облегчения управления лог-файлами . Особенно Logrotate полезен там, где создается большое количество лог-файлов. Утилита позволяет в автоматическом режиме архивировать, удалять, очищать и отправлять на e-mail лог-файлы. Этот процесс обычно называетсяротацией лог файлов .

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

Установка Logrotate
Установка обычна для Debian / Ubuntu-based дистрибутивов:

$ sudo aptitude install logrotateКраткое описание файла настроек Logrotate Описание того, каким образом Logrotate будет работать с тем или иным лог файлом находится в специальном конфигурационном файле. Как правило, они располагаются в директории /etc/logrotate.d/ . Например, файл конфигурации для apache2 выглядит следующим образом: $ more /etc/logrotate.d/apache2 /var/log/apache2/*.log { weekly # ротация раз в неделю missingok # отсутствие файла не является ошибкой rotate 52 # сохраняется последние 52 ротированных файла compress # сжимать ротируемый файл delaycompress # сжимать предыдущий файл при следующей ротации # (т.е. файл *.log.1 будет не сжат, а *.log.2 и далее сжатыми) notifempty # не обрабатывать пустые файлы create 640 root adm # сразу после ротации создать пустой файл с заданными правами и пользователем sharedscripts # крипты prerotate/postrotate будут выполнены только один раз # не зависимо от количества журналов, подходящих под заданный шаблон postrotate # скрипт будет выполнен сразу после ротации if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then /etc/init.d/apache2 reload > /dev/null fi endscript }

При этом, первая строка /var/log/apache2/*.log есть ничто иное, как шаблон обрабатываемых лог-файлов. Он означает, что указанная конфигурация ротации будет использоваться для всех файлов, находящихся в директории /var/log/apache2/ и имеющих расширение «log».

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

Основные опции Logrotate

Как правило, после настройки конфигурационного файла появляется необходимость проверить работуlogrotate для новых логов. Для этого есть возможность непосредственного запуска logrotate из командной строки. При этом допускаются следующие опции:

  • -d . Включает режим отладки, а так же дублирует опцию -v . В режиме отладки никаких действий с логами не будет выполнено.
  • -f, —force . Заставляет logrotate выполнить ротацию логов. Бывает необходимо после добавления новых конфигурационных файлов или если старый лог файл был удалён вручную; таким образом будут созданы новые лог-файлы и журналирование будет корректно продолжено.
  • -m, —mail command . Указывает, какую команду использовать для отправки журналов по почте. Команда должна принимать 2 входных параметра:
    • заголовок письма
    • получателя письма
  • -s, —state statefile . Указывает на использование альтернативный файл состояния. Полезно в случаях, когда logrotate работает от имени разных пользователей для различных наборов лог-файлов. Дефолтный файл состояния: /var/lib/logrotate/status
  • —usage . Выводит краткую инструкцию по использованию утилиты.
  • -v, —verbose . Вывод диагностических сообщений во время ротации

Пример настройки Logrotate

В качестве примера допустим, что в директории /home/site/сайт/logs/ располагаются лог-файлы таких веб серверов, как nginx и apache. Работают они в связке: — фронтенд, apache2-бэкенд.

$ more /etc/logrotate.d/debianworld.ru # Ротация логов nginx (front-end) # Отдает статику, все остальное - проксирует на apache. # Лог ведется более интенсивно. /home/dw/debianworld.ru/logs/nginx_*.log { daily # ежедневная ротация missingok # отсутствие файла не является ошибкой rotate 45 # хранится история за 45 дней compress # ротируемые файлы сжимаются delaycompress # ротируемый файл не сжимается, остальные - сжимаются notifempty # не обрабатывать пустые файлы create 640 dw www-data # права, пользователь нового файла sharedscripts # prerotate/postrotate выполняются только 1 раз prerotate # Cбор статистики посещений для AWstats /usr/bin/perl /usr/lib/cgi-bin/awstats.pl -update -config=debianworld.ru -databasebreak=day endscript postrotate # Перезапуск nginx [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript } # Ротация логов apache2 (back-end) # Лог ведется менее интенсивно. /home/dw/debianworld.ru/logs/apache*.log { weekly # еженедельная ротация missingok # отсутствие файла не является ошибкой rotate 4 # хранится история за 4 недели compress # ротируемые файлы сжимаются nodelaycompress # ротируемый файл так же сжимается notifempty # не обрабатывать пустые файлы create 640 dw www-data # права, пользователь нового файла sharedscripts # postrotate выполняется только 1 раз postrotate # Перезапуск apache2 if [ -f /var/run/apache.pid ]; then /etc/init.d/apache2 restart > /dev/null fi endscript }

Logrotate – это программа которая дает возможность управлять логами в системы Unix/Linux. Утилита выполняет автоматическую ротацию, удаление или сжатие логов. Logrotate помогает сохранять место на диске. Утилиту довольно просто настроить и сейчас, вы убедитесь в этом.

Установка Logrotate для управления логами в Unix/Linux

Я приведу наглядные примеры использования на различных Unix/Linux ОС.

Установка Logrotate для управления логами в Debian/Ubuntu

Обновим пакеты в ОС:

# apt-get update -y

Для установки используем:

# apt-get install logrotate -y

Установка Logrotate для управления логами в CentOS/Fedora/RedHat

Обновим пакеты в ОС:

# yum update -y

Для установки используем:

# yum install logrotate -y

После чего, переходим к настройке и запуску логротейта.

Установка Logrotate для управления логами в Mac OS X

Выполняем установку HomeBrew — и, выполним поиск пакета:

$ brew search logrotate

Для установки, служит команда:

$ brew install logrotate

После чего, переходим к настройке и запуску logrotate.

Настройка Logrotate для управления логами в Unix/Linux

Конфигурационный файл можно найти в:

# vim /etc/logrotate.conf

Мой конфиг выглядит следующим образом:

Weekly create rotate 4 dateext include /etc/logrotate.d /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 }

Логи уровня приложения (заменяющие настройки по умолчанию в случае необходимости) хранятся в:

/etc/logrotate.d/

Я не буду заморачиваться и пропишу один конфиг для всей ротации (можно настраивать для каждого отдельно):

# vim /etc/logrotate.d/For_ALL

Прописываем:

/var/log/*.log { monthly size 100M rotate 7 compress delaycompress missingok notifempty create 644 root root }

Я беру все логи которые имеют любое название и заканчиваются на.log и отслеживаю их в интервале — месяц (служит директива monthly). Если превышает размер лога (size 100M), то выполнить ротацию Ротация происходит после 7 дней (файлы сохраняются 7 дней). Лог-файлы я сжимаю (директива compress). Опция delaycompress задерживает выполнение сжатия до следующей ротации логов, но она работает только с параметром — compress. Параметр missingok дает возможность обрабатывать следующий лог если какой-то отсутствует и не выдавая об ошибке. С опций notifempty можно запретить ротацию пустых файлов. После ротации логов, все будет удалено и чтобы выполнялось сохранение логов, нужно создать файлы снова. Так вот, create позволяет это делать.

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

После чего, можно выполнить проверку того, что создали (без его выполнения, только тест):

# logrotate -d /etc/logrotate.d/For_ALL

Если отладка не показала ничего плохого, можно запустить ротацию:

# logrotate -f -v /etc/logrotate.d/For_ALL

Вместо того, чтобы сжимать логи, можно переименовать их. Для этого есть директива dateext. Если наш формат даты отличается от yyyymmdd по умолчанию, мы можем указать его с помощью dateformat:

Dateext dateformat -%d%m%Y notifempty

Так же, можно по окончанию, отправить письмо на указанный емейл:

Mail mail_user@сайт

Если не хотите чтобы создавались пустые файлы после ротации, используйте:

Nocreate

Не откладывать сжатие файла на следующий цикл

Nodelaycompress

Если не хотите отправлять старые логи на почту, то юзайте:

Сохранять все логи в одной и той же папке:

Noolddir

Интервалы для ротации:

Daily weekly monthly yearly

Размеры для ротации (после превышения указанного размера, будет выполнятся ротация):

Size 6k size 66M size 66G

Можно посылать произвольные команды после выполнения ротации, например:

Postrotate echo "Ротация выполнена!" | mail root endscript

Данную утилиту, нужно запускать:

# logrotate /etc/logrotate.d/For_ALL

Можно автоматизировать и закинуть «logrotate» команду в crontab.

PS: По умолчанию, это возможно уже сделано:

# ls /etc/cron.daily/ cups logrotate makewhatis.cron mlocate.cron prelink readahead.cron tmpwatch

Например, файл конфигурации для apache2 выглядит следующим образом:

/var/log/apache2/*.log { weekly missingok rotate 2 compress delaycompress notifempty create 640 root root 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 }

Ротация производится раз в неделю. При отсутствии лога — не выводить ошибку. Сохранять 2 последних ротированных фалов и конечно же, сжимать их, но для пустых файлов никаких действий не выполнять. После того, как ротация прошла, создавать пустой файл с указанными правами.

Опции Logrotate

Наиболее часто использующиеся опции:

D — Данная опция, дает возможность включить отладочный режим, который использует «-v» параметр. В этом режиме, ничего не будет выполнятся и применятся.

F, —force — Данная опция, дает возможность принудительно запустить logrotate и запустить ротацию логов. Иногда бывает полезным, например — когда добавили новый функционал в конфиг или старые логи удалены вручную и чтобы не создавать новые файлы вручную, можно запустить логротейт с данной опцией.

M, —mail command — Позволяет указывать команду для отправки лог-файлов по почте и она должна содержать входные параметры:

  • заголовок письма
  • получателя письма

После выполнения, логи будут отправлены на указанное мыло (команда читает данные со стандартного входа STDIN), а командой по умолчанию — /usr/bin/mail -s.

S, —state statefile — Данная опция позволяет задавать произвольный файл с состоянием. Это хорошо использовать тогда, когда в системе имеется несколько пользователей, которые работают (запускают) с logrotate. По умолчанию, данный фал сохраняется в /var/lib/logrotate/status.

—usage — Показать мануал по использованию данной утилиты.

V, —verbose — Данная опция, позволяет выводит все происходящее на экран (весь вывод).

Вот и все, статья «Установка Logrotate для управления логами в Unix/Linux» завершена!

Понравилась статья? Поделиться с друзьями: