Управление файлами протоколов


Файлы протоколов растут, и вам следует решить, до какого размера можно позволить им расти. Стандартный способ — ротация протоколов (log rotation). При ротации протоколов самые старые протоколы удаляются, текущий файл протокола закрывается и ему присваивается другое имя, а для следующих данных создается новый файл протокола. В состав FreeBSD входит базовый обработчик протоколов newsyslog(8), способный также сжимать файлы, перезапускать демоны и выполнять все рутинные операции по ротации протоколов. cron(1) запускает newsyslog ежечасно.

При запуске newsyslog(8) считывает /etc/newsyslog.conf и проверяет каждый файл протокола, указанный в конфигурационном файле. Если встретится условие ротации, то выполняется ротация протокола и другие надлежащие действия. В файле /etc/newsyslog.conf каждому протоколу отводится одна строка с семью полями. Например:

/var/log/ppp.log         root:network     640     3     100    *    JC

Давайте рассмотрим все поля по очереди.

Путь к файлу протокола

Первое поле каждой строки содержит полный путь к обрабатываемому файлу протокола (в нашем примере — /var/log/ppp.log).

Владелец и группа

Во втором поле (в нашем примере — root:network) указаны владелец и группа обрабатываемого файла, разделенные двоеточием. Это необязательное поле, отсутствующее во многих стандартных записях.

newsyslog(8) может изменять владельца и группу в старых файлах протокола. По умолчанию файлами протокола владеет root, и они принадлежат группе wheel. Обычно владельца этих файлов не меняют, но к этой возможности имеет смысл прибегнуть на многопользовательских машинах.

Можно изменить только владельца или только группу. В данных случаях необходимо ставить двоеточие, даже если перед или после этого символа ничего нет. Например, значение :www изменит группу на www, а значение mwlucas: сделает меня владельцем файла.

Права доступа

Третье поле (640 в нашем примере) — это права доступа в стандартном для UNIX представлении из трех цифр.

Количество

Следующее поле — количество (count) старых файлов протокола, которые должна хранить newsyslog(8). newsyslog(8) нумерует архивированные файлы протокола от новых к старым, начиная с 0 для самого свежего файла протокола. Например, при значении по умолчанию, равном 5 для /var/log/messages, вы найдете следующие файлы протокола:

messages
messages.0.bz
messages.1.bz
messages.2.bz
messages.3.bz
messages.4.bz
messages.5.bz

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

Размер

Пятое поле (в нашем примере — 100) — это размер файла в килобайтах. При запуске программа newsyslog(8) сравнивает размер, указанный в этом поле, с размером файла. Если размер файла больше указанного, файл подвергается ротации. Если размер файла не должен влиять на проведение ротации, поставьте здесь звездочку (*).

Время

Пока что все было просто, да? Что ж, шестое поле, время ротации, меняет все дело. В поле времени возможно четыре значения: звездочка (*), число и дата в двух различных форматах.

Если вы не хотите проводить ротацию протоколов на основании размера файла, поместите здесь звездочку (*).

Если поставить простое число, newsyslog(8) выполнит ротацию протоколов по истечении заданного количества часов. Например, если требуется проводить ротацию каждые 24 часа и неважно, когда именно она происходит, укажите в этом поле значение 24.

Формат даты чуть более сложен.

Формат времени ISO 8601

Любая запись, начинающаяся с символа @, — это время в ограниченном формате ISO 8601. Это стандартный формат, применяемый программой newsyslog(8) в большинстве UNIX-подобных систем. Первоначально данный формат применялся в базовой программе newsyslog(8), Управление файлами протоколов 729 разработанной в MIT. Правда, этот стандарт немного бестолков, но его поддерживают все UNIX-подобные операционные системы.

Полная дата в формате ISO 8601 — это 14 цифр с символом Т в середине. Первые четыре цифры означают год, следующие две — месяц, следующие две — день месяца. Символ Т после даты играет роль точки в десятичной дроби, отделяя целые дни от доли одного дня. Следующие две цифры — это часы, следующие две — минуты, следующие две — секунды. Например, дата 2 марта 2008 года и время 21 час 15 минут и 8 секунд в формате ISO 8601 будут представлены так: 20080302Т211508.

Если даты в ограниченном формате ISO 8601 приведены полностью, то все достаточно просто, однако при неполном указании даты возникает путаница. Например, если указать только поля рядом с Т, а остальные оставить пустыми, то незаполненные поля будут расценены как групповые символы. Например, соответствует первому числу каждого месяца. Значение 4Т00 соответствует полуночи четвертого числа каждого месяца. Значение Т23 соответствует 23 часам, или 11 часам вечера каждого дня. При указании @Т23 протоколы будут подвергаться ротации каждый день в 11 часов вечера.

Как и в случае cron(1), необходимо точно указывать часы. Например, дата, @7Т, означает ротацию протоколов каждый час в седьмой день месяца. В конце концов, такая запись соответствует целому дню! Значение @7Т01 означает ротацию протоколов в 1 час ночи 7 числа каждого месяца, что выглядит более подобающим. Зато не требуется указывать минуты и секунды, так как ротация протоколов производится всего один раз в час.

Формат времени, специфичный для FreeBSD

В формате ISO 8601 нехорошо то, что он не позволяет легко назначить еженедельное задание или указать последний день месяца. Именно по этой причине в систему FreeBSD включена поддержка другого формата времени, позволяющего легко указывать эти вполне обычные даты. Любое значение, которому предшествует знак доллара ($), представляет время в формате месяц неделя день, специфичном для FreeBSD.

В этом формате применяются три идентификатора: М (день месяца), W (день недели) и Н (час дня). За каждым идентификатором следует число, означающее конкретное время. Часы задаются в диапазоне от 0 до 23, дни недели — от 0 (воскресенье) до 6 (суббота). Нумерация дней месяца начинается с 1 и доходит до последнего числа месяца, которое может быть представлено идентификатором L. Например, для ротации протоколов пятого числа каждого месяца в полдень надо указать $М5Н12. Для запуска анализатора файлов протоколов в 22 часа последнего дня месяца применяйте запись $MLH22.

Ротация по размеру и по времени

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

Флаги

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

Формат файла протокола и сжатие

Протокол может быть либо текстовым, либо двоичным файлом.

Двоичные файлы можно записывать только специальным образом. Каждый новый файл протокола программа newsyslog(8) начинает с сообщения «logfile turned over» (файл протокола подвергнут ротации), но добавление такого текста в двоичный файл может повредить его. Флаг В сообщает программе newsyslog(8), что это двоичный файл и заголовок не следует записывать.

Однако многие файлы протоколов представляют собой простой текст ASCII, и программа newsyslog(8) может и должна вставлять сообщение в начало файла, указывая на то, что протокол был родвергнут ротации. Кроме того, сжатие старых протоколов позволит сохранить много свободного места на диске. Флаг J предписывает программе newsyslog(8) сжимать файлы протоколов с помощью bzip(1), а флаг Z — с помощью gzip.

Флаги специальной обработки протоколов

При ротации и создании файлов протоколов программа newsyslog(8) может выполнять какие-то особенные действия. Ниже описаны наиболее используемые, а об остальных вы узнаете на странице руководства newsyslog.conf(5).

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

Возможно, у вас имеется множество похожих друг на друга файлов протоколов, для которых необходимо реализовать одинаковый алгоритм обработки. Флаг G сообщает программе newsyslog(8), что имя файла протокола в начале строки — это на самом деле шаблон имени файла в формате командного интерпретатора и что выполнять ротацию всех файлов протокола, соответствующих этому выражению, следует одинаково. Регулярные выражения подробно описаны на странице руководства regexp(3). Перед чтением рекомендую принять аспирин.

Вы можете потребовать от newsyslog(8) создать файл, если он отсутствует. Для этого предназначен флаг С. Программа syslogd не будет производить протоколирование при отсутствии файла.

Наконец, если ни один из флагов не требуется, используйте дефис (-) как символ-заполнитель. Хотя вам, так или иначе, потребуется один из флагов newsyslog.conf, чтобы указать путь к pid-файлу.

Путь к pid-файлу

Следующее поле — путь к pid-файлу (в данном примере не показано, но его можно найти, заглянув в /etc/newsyslog.conf). pid-файл — это простой способ записи идентификатора процесса (PID) той или иной программы, причем эту запись могут легко просматривать другие программы. Если вы приводите полный путь к pid-файлу, то при ротации протоколов newsyslog(8) пошлет программе сигнал kill -HUP. По этому сигналу процесс должен закрыть файл протокола и перезапустить себя. Не каждый процесс создает свой pid-файл и не все программы требуют выполнения особых действий во время ротации их протокола.

Сигнал

Большинство программ выполняют ротацию протокола по сигналу SIGHUP, но некоторым программам нужно отдельно сигнализировать о ротации их протокола. Для таких программ в последнем поле, после pid-файла, можно указать точный номер сигнала.

Пример записи в newsyslog.conf

Собрав все это воедино, рассмотрим худший случай — пример «вы-наверное-шутите». Предположим, у вас есть протокол базы данных, ротацию которого требуется проводить в 11 часов вечера последнего дня каждого месяца. В документации базы данных сказано, что для ротации файлов требуется послать программе сигнал прерывания (SIGINT, или сигнал с номером 2). Вам нужно, чтобы архивированными протоколами владел пользователь dbadmin. Просмотр протоколов разрешен только этому пользователю, а хранить протоколы надо шесть месяцев. Более того, протоколы представляют собой двоичные файлы. Строка файла newsyslog.conf будет такой:

/var/log/database     dbadmin:    600   6  *  $MLH23  В  /var/run/db.pid  2

Этот пример — исключение; в большинстве случаев достаточно указать имя файла и условия ротации.

Комментарии запрещены.