Как сделать ротацию логов

Обновлено: 05.07.2024

СИНТАКСИС

logrotate [-dv] [-f|—force] [-s|—state файл] файл_конфигурации+

ОПИСАНИЕ

ОПЦИИ

ФАЙЛ КОНФИГУРАЦИИ

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

В последнем разделе определены параметры для все файлов, находящихся в /var/log/news. Обращение всех файлов производится ежемесячно. Это предусматривает единые указания для обращения, и в случае возникновения ошибки при обработке больше чем одного файла сжатие файлов журналов не будет произведено.

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

Сегодня мы поговорим о том что такое ротация логов, с чем ее едят и насколько она вкусна. Ротация — процесс обновления чего‐то , круговорот чего‐то . Но что такое ротация логов?

Ротация логов — это процесс архивирования логов, удаление старых логов и все из этого вытекающее. Оно нужно для того, чтобы внезапно у вас не забилось все место на HDD/SSD различными логами, ну, а так же для того, чтобы не было слишком много одинаковых и очень больших лог‐файлов . При ротации логов происходит несколько вещей:

Порядок всех этих действий может быть произвольным, и зависит от напрямую от реализации утилиты для ротации логов. В linux‐based системах зачастую используется утилита logrotate которая запускается по умолчанию (покрайней мере в ubuntu) кроном раз в день и делает свою грязную работу. В bsd системах, насколько мне известно, используется newsyslog для той же самой работы, но т.к. freebsd я видел всего несколько раз в жизни — ничего полезного я сказать о ней не могу :).

Logrotate имеет свой конфигурационный файл /etc/logrotate.conf в котором описаны глобальные параметры, а так же, подключаются различные дополнительные конфиги из /etc/logrotate.d в которых описаны действия для различных демонов. Например, конфиг nginx выглядит примерно так:

Конфигурационные файлы logrotate человекопонятные. В частности, в этом конфигурационном файле описываются правила для файлов попадающийх под glob‐шаблон /var/log/nginx/*.log:

  • missingok — говорит о том, что если файла нету то все ок
  • daily — проводить ротацию ежедневно
  • rotate X — хранить X файлов
  • compress — сжимать старые файлы
  • delaycompress — не сжимать последний лог
  • notifempty — не архивировать пустые файлы
  • create ACCESS_MODE USER GROUP — с какими правами создавать архивы
  • sharedscripts — какая то фишка для prerotate и postrotate:)
  • prerotate, postrotate — что сделать перед ротацией и после нее.

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

Мораль сей басни такова: работает — не трогай, блядь, и все будет работать отлично! А если хочется потрогать — ССЗБ :)

Что бы избе­жать запол­не­ния дис­ка ста­ры­ми лога­ми — необ­хо­ди­мо настро­ить ути­ли­ту logrotate .

Основ­ной файл кон­фи­гу­ра­ции — /etc/logrotate.conf .

Для созда­ния настро­ек отдель­ных логов — исполь­зу­ем дирек­то­рию /etc/logrotate.d , кото­рая опи­са­на как:

Доба­вим наблю­де­ние за логом /var/log/iptables.log .

Созда­ём файл /etc/logrotate.d/iptables.conf с таким содержимым:

/var/log/iptables.log rotate 5
missingok
notifempty
compress
size 1M
daily
create 0644 root root
postrotate
service rsyslog restart > /dev/null
endscript
>

  • rotate — коли­че­ство копий ста­рых логов;
  • missingok — не писать сооб­ще­ния в stdout , если файл отсутствует;
  • notifempty — не выпол­нять ника­ких дей­ствий, если файл пустой;
  • compress — сжи­мать gzip ;
  • size — раз­мер фай­ла, при дости­же­нии кото­ро­го он будет сжат и сохра­нён как старый;
  • daily — выпол­нять про­вер­ку каж­дый день;
  • create — пра­ва досту­па и вла­де­лец при созда­нии ново­го файла;
  • olddir — пере­ме­щать ста­рые логи в ука­зан­ную директорию;
  • postrotate/endscript — дей­ствие, выпол­ня­е­мое после рота­ции логов;
  • mail — адрес, на кото­рый высы­лать уве­дом­ле­ние о ротации;

Для про­вер­ки — выполняем:

Учти­те — это дей­ствие выпол­нит обя­за­тель­ную рота­цию всех логов, ука­зан­ных в кон­фи­гу­ра­ции logrotate .

Рота­ция поч­то­вых логов:

cat /etc/logrotate.d/maillog
/var/log/maillog
daily
missingok
sharedscripts
rotate 10
compress
delaycompress
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
>

Для при­ме­ра буду опи­сы­вать рота­цию логов nginx. После уста­нов­ки nginx, вы полу­чи­те сле­ду­ю­щий кон­фиг для рота­ции логов — /etc/logrotate.d/nginx.

Все не ука­зан­ные явно пара­мет­ры будут брать­ся из дефолт­но­го кон­фи­га /etc/logrotate.conf.

Для того, что­бы защи­тить сер­вер от запол­не­ния все­го сво­бод­но­го про­стран­ства дис­ка лога­ми aceess.log, рота­ция раз в день не под­хо­дит. Тебе за час без напря­га смо­гут забить весь диск лога­ми. Луч­ше настро­ить рота­цию по дости­же­нии опре­де­лен­но­го раз­ме­ра фай­ла. Для это­го вы исполь­зу­е­те параметр:

И жде­те, что по дости­же­нии раз­ме­ра фай­ла access.log в десять мега­байт, будет про­из­ве­де­на рота­ция. На самом деле не будет. По-умол­ча­нию, logrotate запус­ка­ет­ся раз в сут­ки, поэто­му он при всем жела­нии не смо­жет сле­дить за раз­ме­ром фай­ла и роти­ро­вать его чаще, чем раз в сутки.

За его запуск отве­ча­ет скрипт в дирек­то­рии /etc/cron.daily/logrotate. Для того, что­бы logrotate мог про­ве­рять раз­мер лог фай­ла хотя бы раз в час, скрипт запус­ка надо пере­не­сти в дирек­то­рию /etc/cron.hourly. А для более частой про­вер­ки, доба­вить его напря­мую в cron с нуж­ным интер­ва­лом запус­ка. Напри­мер, раз в 5 минут.

Допу­стим вы все это сде­ла­ли, но логи все рав­но не будут роти­ро­вать­ся при дости­же­нии задан­но­го раз­ме­ра. Понять, в чем же теперь про­бле­ма, не так про­сто. При запус­ке logrotate вы не уви­ди­те ника­ких оши­бок. Он про­сто ниче­го не будет делать. Понять, в чем про­бле­ма, мож­но толь­ко при запус­ке в режи­ме отлад­ки. Там вы уви­ди­те ошиб­ку, если в этот день рота­ция уже была хотя бы раз.

Смысл тут в том, что logrotate сего­дня уже про­из­вел рота­цию и создал архив лога с опре­де­лен­ным име­нем и вто­рой раз такой же файл он сде­лать не может. А мас­ка име­ни фай­ла при созда­нии настро­е­на в фор­ма­те %Y%m%d. За эту мас­ку отве­ча­ет пара­метр в /etc/logrotate.conf:

Самый про­стой вари­ант — это про­сто заком­мен­ти­ро­вать этот пара­метр, тогда все архи­вы логов будут иметь сле­ду­ю­щую мас­ку в файлах:

И так далее. Если же вам хочет­ся сохра­нить исход­ный фор­мат лога для всех фай­лов, а для тех, что роти­ру­ют­ся по раз­ме­ру, настро­ить дру­гую мас­ку име­ни, исполь­зуй­те допол­ни­тель­ный параметр:

Таким обра­зом, что­бы настро­ить рота­цию лог фай­ла, напри­мер, aceess.log, по дости­же­нии опре­де­лен­но­го раз­ме­ра, вам нужно:

  1. Запус­кать через cron logrotate с доста­точ­но высо­кой пери­о­дич­но­стью, напри­мер раз в час или чаще.
  2. Настро­ить мас­ку фай­ла для архи­ва лога, что­бы она была уни­каль­ной в каж­дый момент запус­ка logrotate.

Вот при­мер для рота­ции кон­фи­гов nginx или apache по дости­же­нии раз­ме­ра лог фай­ла в 10 мегабайт.

Logrotate - это системная утилита, которая управляет автоматической ротацией и сжатием лог-файлов. Если в процессе длительной работы сервера файлы не были ротированы, сжаты и периодически не удалялись, то рано или поздно они могут занять весь доступный объем памяти.

Logrotate устанавливается по умолчанию на сервере и настроена для обработки ротации журналов для всех установленных пакетов и приложений.

Проверка версии Logrotate:

Вывод команды будет следующий:

Стандартная конфигурация Logrotate хранится по двум путям:

  • Основной файл конфигурации — /etc/logrotate.conf.
  • Для создания настроек отдельных логов — используем директорию /etc/logrotate.d

Рассмотрим конфигурационный файл Logrotate /etc/logrotate.d:

Вывод команды будет таким:

Этот файл содержит конфигурационные блоки для двух разных файлов журнала в каталоге. Оба блока имеют одинаковые опции. Любые параметры, не заданные в этих конфигурационных блоках, наследуют значения по умолчанию или значения, установленные в файле /etc/logrotate.conf.

Основные директивы управления и обработки логов:

  • monthly - ротация раз в месяц. Возможные варианты daily, weekly, monthly, size;
  • notifempty - не ротировать пустой лог-файл.
  • rotate - указывает сколько старых логов нужно хранить, в параметрах передается количество;
  • create - указывает, что необходимо создать пустой лог файл после перемещения старого;
  • dateext - добавляет дату ротации перед заголовком старого лога;
  • compress - указывает, что лог необходимо сжимать;
  • delaycompress - не сжимать последний и предпоследний журнал;
  • extension - сохранять оригинальный лог файл после ротации, если у него указанное расширение;
  • mail - отправлять Email после завершения ротации;
  • maxage - выполнять ротацию журналов, если они старше, чем указано;
  • missingok - не выдавать ошибки, если лог файла не существует;
  • olddir - перемещать старые логи в отдельную папку;
  • postrotate/endscript - выполнить произвольные команды после ротации;
  • start - номер, с которого будет начата нумерация старых логов;
  • size - размер лога, когда он будет перемещен;

Для управления файлами журналов для приложений можно использовать два варианта:

  • Создать новый файл конфигурации Logrotate и поместить его в каталог /etc/logrotate.d/. Он будет работать ежедневно, как пользователь root вместе со всеми другими стандартными заданиями LogRotate.
  • Создать новый конфигурационный файл и запустить его с настройками LogRotate по умолчанию в Ubuntu.

Создание конфигурации в /etc/logrotate.d/

В качестве примера настроим обновления для сервера, который пишет логи в файлы access.log и error.log, расположенные в каталоге /var/log/example-app/.

Чтобы добавить конфигурацию каталог /etc/logrotate.d/, откройте новый файл:

  • create 0640 www-data www-data - данная команда создаст новый пустой файл журнала после ротации с заданными разрешениями (0640), владелец ( www-data) и группы (www-data);
  • sharedscripts - эта опция означает, что любые скрипты, добавленные в конфигурацию, выполняются только один раз за запуск после сжатия файлов, а не для каждого отдельного обновленного файла. Поскольку наша конфигурация будет соответствовать двум лог-файлам (access.log и error.log), скрипт, указанный в postrotate, будет запускаться только 1 раз;
  • postrotate to endscript - скрипт в этом блоке будет запущен после того, как файл журнала обновится. В примере приложение перезагружается.

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

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

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

Создание конфигурации LogRotate

В этом примере мы имеем приложение, которое работает под пользователем testing, генерация журналов, которые хранятся в каталоге /home/testing/logs/. Нам нужно сделать ротацию этих журналов ежечасно, поэтому мы должны установить его за пределами структуры /etc/logrotate.d, представленной в Ubuntu.

Создадим через текстовый редактор конфигурационный файл в нашем каталоге.

Затем вставьте следующую конфигурацию:

file

Сохраните и закройте файл.

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

Необходимо настроить конфигурацию в соответствии с вашим приложением.

Сделаем файл журнала чтобы проверить, что он работает:

Поскольку журналы принадлежат testing нам не нужно использовать sudo. Однако нам нужно указать файл состояния. Этот файл записывает, что logrotate видел и сделал в прошлый раз, так что он знает, что делать при следующем запуске.

Мы попросим Logrotate поместить файл состояния прямо в наш домашний каталог для этого примера. Мы можем указать где угодно, что доступно и удобно:

–verbose распечатает подробную информацию о том, что делает Logrotate. Это первый раз, когда LogRotate видит этот файл журнала, так, насколько это известно, файлу ноль часов, и к нему не должно быть применена ротация.

Если мы посмотрим на файл состояния, мы увидим, что Logrotate записал информацию о запуске:

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

Если вы хотите заставить LogRotate производить ротацию файла журнала, тогда надо использовать флаг –force:

Далее, нужно настроить задание cron для запуска Logrotate каждый час. Откройте crontab пользователя:

Откроется текстовый файл. Возможно, в файле уже есть некоторые комментарии, объясняющие ожидаемый основной синтаксис.
Переместите курсор на новую пустую строку в конец файла и добавьте следующее:

Читайте также: