Протоколирование с помощью syslogd


Deco Grille. Изготовим на заказ металлическую решетку на столешницу над радиатором Москва.

Система протоколирования FreeBSD весьма полезна. Любые UNIX-подобные операционные системы позволяют протоколировать практически все происходящее с любой степенью подробности. По умолчанию система протоколирования регистрирует события для основных ресурсов, но администраторы могут конфигурировать протоколирование, как им надо. Почти все программы интегрированы с системой протоколирования syslogd(8).

Протокол syslogd работает с сообщениями. Программы отправляют отдельные сообщения, а демон syslogd(8) получает их и обрабатывает, syslogd обслуживает сообщения в соответствии с тем или иным источником сообщений (facility) и уровнем важности. Обе характеристики указываются в сообщениях, направляемых программе syslogd. Для управления системными протоколами надо понимать, что такое источник и уровень.

Источники

Источник — это тег, указывающий происхождение записи в протоколе. Это произвольное обозначение, простая текстовая строка, предназначенная для различения программ. В большинстве случаев у каждой программы, требующей уникального протокола, есть уникальное обозначение. Многие программы и протоколы имеют обозначения, выделенные специально для них. Например, FTP — как раз такой типичный протокол, для которого у syslogd есть специальное обозначение. Кроме того, syslogd поддерживает множество общих обозначений, которые могут быть задействованы любой программой.

Ниже перечислены стандартные обозначения и типы информации, которую они предоставляют.

auth
Общедоступная информация, относящаяся к авторизации пользователей во время входа в систему или при вводе команды su(1).

authpriv
Секретная информация, относящаяся к авторизации пользователей. Доступ к ней есть только у root.

console
Сообщения, которые обычно выводятся на системную консоль.

cron
Сообщения планировщика заданий.

daemon
Вместилище для сообщений всех системных демонов, не имеющих других явных обозначений.

ftp
Сообщения серверов FTP и TFTP.

kern
Сообщения ядра.

lpr
Сообщения системы печати.

mail
Сообщения почтовой системы.

mark
Это обозначение помещается в протокол каждые 20 минут. Полезно при комбинировании с другим протоколом.

news
Сообщения демонов Usenet News.

ntp
Сообщения сетевого протокола синхронизации времени (Network Time Protocol).

security
Сообщения различных программ защиты, таких как pfctl(8).

syslog
Сообщения системы протоколирования о самой себе. Однако не выполняйте протоколирование, когда получаете сообщения от syslogd. В противном случае может произойти путаница.

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

uucp
Сообщения протокола UNIX-to-UNIX Copy Protocol. Этот протокол применялся в UNIX до эпохи Интернета. Вы вряд ли когда-нибудь встретитесь с ним.

local0 - lосаl7
Зарезервировано для нужд администратора. Во многих программах можно задавать источник протоколирования. Выберите одно из этих обозначений, если есть такая возможность. Например, сервис поддержки пользователей может протоколироваться как local0.

Хотя у большинства программ имеются определенные значения по умолчанию, тем не менее, это ваша задача как сисадмина — определить, какие программы и с какими обозначениями должны протоколироваться.

Уровни

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

Протокол syslog предлагает восемь уровней важности. Эти уровни позволяют извещать syslogd о том, что надо записывать, а что следует отбросить. Вот перечень уровней в порядке убывания важности:

emerg
Паника системы. Сообщения поступают на каждый терминал. По существу, система в аварийном состоянии. Вам даже не понадобится перезагружать систему — она сделает это сама.*

alert
Плохо, но все же не как emerg. Система может продолжать работать, однако этой ошибке следует немедленно уделить внимание.

crit
Критические ошибки, например проблемы с аппаратными средствами, вроде сбойных блоков на жестком диске, или серьезные трудности с программным обеспечением. Можете продолжить работу, если хватит смелости.

err
Хотя эти ошибки и не разрушают систему, их следует исправить.

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

notice
Общая информация, не требующая действий с вашей стороны, например факт запуска или останова демона.

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

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

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

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

Обработка сообщений с помощью syslogd(8)

Демон syslogd(8) получает сообщения из сети и сравнивает их с записями в /etc/syslog.conf. В этом файле две колонки. В первой описывается сообщение протокола либо по источнику и уровню, либо по имени программы. Во второй описывается действие, которое будет выполнено демоном syslogd(8), если протокольное сообщение соответствует описанию. Например, рассмотрим следующую запись из файла syslog.conf по умолчанию:

mail.info       /var/log/maillog

Эта запись предписывает демону syslogd(8) протоколировать в файле /var/log/maillog сообщения от источника mail с уровнем от info и выше.

Групповые символы

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

mail.*         /var/log/maillog

Для протоколирования всех сообщений из любых источников раскомментируйте запись all.log и создайте файл /var/log/all.log:

*.*            /var/log/all.log

Результат вы получите, но информации будет слишком много, чтобы ее можно было применить на практике. Для нахождения нужных фрагментов придется выполнять сложные команды grep(1). Кроме того, в протоколы попадет вся секретная информация.

Исключение информации

Для исключения информации из протокола применяйте уровень none. Например, ниже из протокола, куда включаются все сообщения, исключается информация authpriv. Записи комбинируются в одной строке с помощью точки с запятой:

*.*; authpriv.none     /var/log/most.log

Сравнение

Также в правилах /etc/syslog.conf можно применять операторы сравнения < (меньше), = (равно) и > (больше). По умолчанию syslogd записывает все сообщения указанного и более высоких уровней, но можно задать нужный диапазон уровней информации. Предположим, что вам нужно протоколировать все сообщения уровня info и выше в основном протоколе, а остальные сообщения — в файле с отладочной информацией:

mail.info       /var/log/maillog
mail.=debug     /var/log/maillog.debug

Запись mail.info собирает все протокольные сообщения источника mail, соответствующие уровню info или выше. Вторая строка охватывает только сообщения уровня не выше debug. В качестве источника сообщений нельзя указать mail.debug, иначе в протокол отладки попадут все записи предыдущего протокола! Таким образом, чтобы отследить деятельность почтового сервера, необязательно просматривать отладочную информацию. А чтобы получить отладочный вывод почтового сервера, не нужно пробираться сквозь дебри информации о передаче почты.

Локальные источники

Многие программы предусматривают возможность протоколирования своих действий с помощью syslogd. Довольно часто они позволяют выбрать нужное обозначение. Для таких случаев зарезервировано несколько источников local. Например, по умолчанию dhcpd(8) (глава 15) использует источник lосаl7. Вот настройка для перехвата таких сообщений и их направления в отдельный файл:

lосаl7.*       /var/log/dhcpd

Если свободные источники local исчерпаны, можно взять другие незадействованные системные источники. Например, мне как-то пришлось воспользоваться источником uucp на нагруженном сервере протокола в сети, где не было служб uucp.

Протоколирование по имени программы

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

!ррр
*.*         /var/log/ppp.log

В первой строке указано имя программы, а во второй групповые символы предписывают демону syslogd(8) добавлять в файл абсолютно все сообщения.

Синтаксис !имя_программы воздействует на все строки, следующие за этим определением, поэтому оно должно стоять последним в файле syslog.conf.

Протоколирование пользовательских сессий

Для протоколирования пользовательских сессий укажите имена пользователей через запятую. Тогда поступающие протокольные сообщения будут отображаться на терминалах указанных пользователей. Для отображения сообщений на терминалах всех пользователей в качестве места назначения укажите звездочку (*). Например, в файле syslog.conf по умолчанию есть такая строка:

*.emerg          *

Здесь сказано, что любое сообщение уровня emerg (авария) появится на терминалах всех пользователей. Поскольку такие сообщения обычно появляются, когда пора попрощаться с пользователями, они в любом случае не помешают.

Отправка протокольных сообщений программам

Наконец, если нужно, чтобы протоколы обрабатывала другая программа, применяйте символ конвейеризации (|) для перенаправления сообщений этой программе:

mail.*          |/usr/local/bin/mailstats.pl

Хост для протоколирования

Обычно в сетях я предусматриваю отдельный хост для протоколирования, обслуживающий не только машины FreeBSD, но и маршрутизаторы Cisco, коммутаторы, машины с другими версиями UNIX и любые другие системы, умеющие общаться с syslogd. Наличие единого хоста, на котором ведется все протоколирование, упрощает обслуживание систем и экономит дисковое пространство. Каждое сообщение в протоколе включает имя хоста, поэтому позднее легко отобрать нужные.

Для отправления протокольных сообщений другому хосту применяется символ @. Например, передача всех сообщений, предназначенных syslogd, на хост протоколирования в моей сети задается такой строкой:

*.*         @loghost.blackhelicopters.org

Файл syslog.conf на хосте протоколирования определяет окончательное место назначения для сообщений, которые получает хост.

На хосте протоколирования можно раздельно протоколировать события для разных хостов, с которых прибывают сообщения. Символ «плюс» (+) возле имени хоста означает, что к этому хосту применяются указанные ниже правила:

+dhcpserver
lосаl7.*         /var/log/dhcpd
+ns1
lосаl7.*         /var/log/named

При подобной конфигурации рекомендую помещать универсальные правила в начало файла syslog.conf, & правила для отдельных хостов — ближе к концу.

Перекрытие при протоколировании

syslog при проверке настроек не следует правилам первого или последнего совпадения; напротив, протоколируются все совпадения. Это означает, что одно и то же сообщение может появляться в нескольких протоколах. Рассмотрим фрагмент конфигурации syslog. (Первая строка взята из syslog.conf по умолчанию, просто я ее укоротил, чтобы уместить на страницу книги.)

*.notice;authpriv.none         /var/log/messages
lосаl7.*                       /var/log/dhcpd

Все сообщения уровня notice и выше будут протоколироваться в файле /var/log/messages. У нас есть сервер DHCP, события которого будут протоколироваться в файле /var/log/dhcpd. Это означает, что все сообщения DHCP уровня notice и выше будут протоколироваться в обоих файлах, /var/log/messages и /var/log/dhcpd. Мне это не нравится; сообщения сервера DHCP должны помещаться только в файл /var/log/dhcpd. Я могу принудительно исключить сообщения DHCP из /var/log/messages с помощью источника none:

*.notice;authpriv.none;lосаl7.none     /var/log/messages

Моя конфигурация для файла /var/log/messages очень быстро разрастается из-за необходимости исключить каждый локальный источник — и это правильно.

Пробелы и символы табуляции

По традиции UNIX-подобные операционные системы требуют разделять колонки в syslog.conf символом табуляции, однако FreeBSD разрешает применять пробелы. Символы табуляции нужны, только если разные UNIX-системы совместно используют один syslog.conf.

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