Настройка ротации логов с помощью newsyslog

Опубликовано:

Ротация (rotate) — это замена текущего открытого, т. е. используемого приложением для записи в данный момент, лог-файла новым и переименование (возможно с архивированием) старого, который замещает еще более старый, существовавший до этого лог. Самый старый файл удаляется.

Помимо настройки самого логирования, которое обычно производиться с помощью syslogd в /etc/syslog.conf, важное значение имеет дальнейшее слежение и управление файлами журналов, которые хранят записи о произошедших событиях. Лог-файлы должны хранится за определенный период времени или содержать определенный размер данных. Так как это влияет на процент свободного места на диске и в частности на место в разделе с логами, за которым необходимо следить, поскольку полное его заполнение может привести к разнообразным проблемам. По современным меркам информация является самой ценной и ее потеря просто недопустима. Тем более если причину возникновения какой-либо проблемы можно выявить только используя журнальные файлы. Да и в конце концов, большой размер самого лог-файла приносит некоторые неудобства при работе с ним, т. к. иногда приходится разбивать его на более мелкие с помощью, к примеру, утилиты split.

В поставке операционной системы FreeBSD идет встроенное средство для ротации (архивирования и перегруппировки) логов newsyslog уже с настройками для ситемных служб. Если заглянуть в директорию /var/log/, то можно увидеть для большинства служб текущий лог-файл и более старые с добавлением вконце в названии цифры, начиная с «0» и также «расширения», указывающего на формат архива, если он был подвержен архивированию.

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

Формат записей в newsyslog.conf:

logfilename – абсолютный путь к логу;
[owner:group] – необязательное поле, которое задает владельца и/или группу назначемых файлу. По умолчанию владельцем является пользователь root с группой wheel;
mode – права доступа к файлу в цифровом представлении;
count – количество сохраняемых файлов;
size и when – поля, определяющие при каких условиях должна произойти ротация лога. В одном из полей указывается нужное значение, будь то размер файла в килобайтах или время, а в другом обычно ставится символ «*», указывающий что обработка должна происходить по второму параметру. Если указаны оба условия, то ротация будет происходить при выполнении любого из них.

Время в поле «when» можно задавать одним из четырех типов:
«*» — время ротации не важно;
«число» — ротация происходит каждое заданное число часов;
ISO-8601 формат — для задания точного времени ротации. Значение обычно начинается с символа «@», если это не полная запись времени. В полном представлении состоит из 16 цифр с буквой T в середине. Первые четыре цифры означают год, следующие две – месяц, и еще две – день месяца, далее в качестве разделения используется буква «T», потом идут по две цифры для часа, минут и секунд. 20110405T011900 — выполнить ротацию 2011 года, 04-го месяца, 05 числа в 01:19:00. @05T00 — 5-го числа каждого месяца в полночь;
FreeBSD формат — «месяц-неделя-день». Значение начинается со знака «$». Этот формат использует три буквенных идентификатора: M (день месяца), W (день недели), H (час дня) и после каждого указывается число, на подобии crontab. $W6H03— запуск ротации по субботам в 3 часа ночи.

flags – флаги, указывающие какие дополнительные действия нужно произвести с файлом;
[/pid_file] – необязательный параметр, определяющий путь к файлу, в котором хранится PID процесса приложения, работающего с данным логом. Если он указан, то приложение будет оповещено о ротации посылкой сигнала, на что оно должно произвести соответствующие действия со своей стороны;
[sig_num] – необязательный параметр, определяющий номер сигнала, посылаемый приложению при ротации, чтобы произошло переоткрытие нового лог-файла для записи. По умолчанию используется SIGHUP, т. е. «1» (в обычных случаях посылается с помощью kill -1 или kill -HUP). Некоторые демоны для переоткрытия лог-файлов требуют другого номера сигнала, как например, для nginx, php-fpm, sphinx нужен SIGUSR1, т. е. «30». Более подробно о сигналах можно посмотреть в man signal.

Флаги:

С – ротируемый файл нужно создать, если он не существует;
B – при ротации не добавлять строку «newsyslog: logfile turned over», что нужно для бинарных файлов для корректной работы с ними в дальнейшем;
J – сжимать лог-файл, используя bzip2;
Z – сжимать лог, использую gzip;
W – если используете флаги Z или J, то newsyslog должен подождать, пока завершиться процесс архивации;
N – Не предупреждать никакой процесс о ротации лог-файла;
G — если указан данный флаг, то в названии лог-файла можно использовать стандартные шаблоны (например ‘*’).

Рассмотрим пример добавления записей в конфигурационный файл /etc/newsyslog.conf.

1
2
3
#logfilename[owner:group] mode count size when flags [/pid_file][sig_num]
/var/log/exim/mainlog mailnull:mail 640 14 * @T00 Z/var/run/exim.pid
/var/log/php-fpm.log 600 7 100 * JC/var/run/php-fpm.pid 30

В первой строчке для журнального файла почтового сервера ротация будет происходить каждый день в полночь и будет послан сигнал по умолчанию PID, записаному в /var/run/exim.pid. Сжатый с помощью gzip архивный файл будет иметь владельца mailnull и группу mail с правами доступа «640». Таких файлов может быть создано 14 штук, т. е. будут сохраняться логи за последние 14 дней + текущий лог-файл.
Во втором случае ротация будет происходить по достижению размера лога в 100 килобайт независимо от времени, владелец/группа по умолчанию (root:wheel), права на файл «600», сжатие будет происходить с помощью bzip2, сигнал будет послан с номером «30» (SIGUSR1).

1
2
# cat /etc/crontab | grep newsyslog
0   *   *   *   *   root    newsyslog

Как видно отсюда, утилита newsyslog запускается с помощью планировщика задач crond на нулевой минуте каждого часа от пользователя root, которая перечитывает конфиг и проверяет требуется ли выполнение каких-либо операций на данный момент. Учтите, если у вас настроена, например, ротация логов каждые 15 минут, то соответственно задачу в кроне необходимо делать с этим интервалом. Для тестов, конечно же, newsyslog можно запускать вручную.

Понравилась статья, расскажи о ней друзьям, нажми кнопку!