Bog BOS: Системный журнал в UNIX (syslog)

Обеспечивает запись в журнал (журналы, системную консоль, почтовый ящик и др.) сообщений от демонов (фоновых процессов), работающих на этом или других компьютерах (через порт 514/udp). Реализован в виде демона syslogd (иногда еще и klogd для обработки сообщений ядра). Осуществляет маршрутизацию сообщений в зависимости от facility (вид/тип/сорт источника сообщений) и уровня серьезности.

facility:

Уровень/приоритет ( в порядке убыванния):

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

Linux

RPM.

RH 6.0: sysklogd-1.3.31-6, RH 6.2: sysklogd-1.3.31-16.

Источник: ftp://ftp.infodrom.north.de/pub/people/joey/sysklogd/

Запуск.

/etc/rc.d/rc?.d/S30syslog -> /etc/rc.d/init.d/syslog

Конфигурация и служебные файлы.

/etc/syslog.conf

Представляет собой набор правил журнализации. Каждое правило состоит из селектора и действия, которые разделяются табуляциями (в старых системах - Solaris 5) или пробелами (Linux). Получив сообщение для записи в журнал (от klogd, от локальной или удаленной программы), syslogd для каждого правила проверяет не подходит ли сообщение под шаблон, определяемый селектором. Если подходит, то выполняется действие. Для одного сообщения м.б. выполнено произвольное количество действий. Селектор состоит из двух частей, разделенных точкой: facility и приоритет. Прописные и строчные буквы не различаются. можно также использовать числа (см. /usr/include/syslog.h). Кроме определенных в syslog.3 facilities, можно указывать mark (регулярные временные метки), security (устаревший синоним для auth). Кроме определенных в syslog.h приоритетов можно использовать warn (синоним для warning), error (синоним для err), panic (синоним для emerg). Сообщения с приоритетом, равным или выше указанного в селекторе, и facility, равным указанному в селекторе, считается подходящим. Звездочка перед точкой соответствует любому facility, после точки - любому приоритету. Слово none после точки - никакому приоритету данного facility. Можно указывать несколько facilities в одном селекторе (через запятую). В одной строке можно указывать несколько селекторов (семантика не ясна: если использовать позитивные селекторы, то логическое ИЛИ, если негативные - none и восклицательный знак - , то логическое И). В новом syslogd (linux) перед приоритетом можно поставить знак равенства - селектору будут соответствовать только сообщения с указанным приоритетом (но не с высшим); восклицательный знак - не будут соответствовать сообщения с приоритетом равным или большим; восклицательный знак и равенство - не будут соответствовать сообщения с приоритетом равным указанному. В качестве действия можно указывать:

Особенности syslog.conf для Solaris. При разборе файла конфигурации syslogd сравнивает адрес loghost  (определяется в /etc/hosts, не через DNS) с адресом своего компьютера и при совпадении определяет переменную LOGHOST. Далее syslog.conf пропускается через макропроцесссор m4(1). В основном это используется для того, чтобы один и тот же конфигурационный файл можно было использовать на клиентских и серверном (с точки зрения syslog) хостах.

/var/lock/subsys/syslog

/var/run/syslogd.pid

/var/run/klogd.pid

/usr/sbin/klogd

читает сообщения ядра (либо через /proc/kmsg, либо с помощью системных вызовов), определяет уровень, преобразует адреса команд в имена программ и передает сообщение syslogd.

Параметры:

Уровни сообщений ядра (определяется по цифре в угловых скобках):

Сигналы:

/usr/sbin/syslogd

Параметры:

Сигналы (kill -имя-сигнала `cat /var/run/syslogd.pid`)

Запускается с правами root. Не меняет права доступа к файлам. Если вынужден создавать файл, то делает его с правами 644. При необходимости ограничить доступ к журналу, соответствующий файл надо создать вручную (или поменять права доступа). Особые проблемы создает logrotate.

Документация:

klogd.8, syslogd.8, syslog.conf.5, sysklogd.8 (то же самое, что syslogd.8), syslog.3.

Вспомогательные программы.

logger - запись сообщения в журнал из командной строки (sh, bash и др.). Параметры:

logrotate (версия 3.2-1/3.3.2-1) - борьба с растущими журналами: разбиение на куски, сжатие, удаление и отправка по почте. Запускается ежедневно cron-ом (/etc/cron.daily/logrotate). Параметры:

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

Собственно /etc/logrotate.conf описывает глобальные параметры и параметры для /var/log/wtmp и /var/log/lastlog и ссылается на директорию /etc/logrotate.d, в которую каждый пакет записывает локальные параметры для своих журналов.

swatch

Программирование (syslog.3).

Инициализация записи в журнал: openlog - указывается стандартный префикс, добавляемый ко всем последующим сообщениям (обычно имя программы, номер процесса в квадратных скобках и двоеточие); имя facility и опции. closelog - завершить запись в журнал. syslog - запись в журнал (указывается facility, приоритет и формат строки как в printf).

Местные особенности.

Все журналы ведутся на одном компьютере. На нем д.б. открыт firewall для 514/udp (только для тех, кто имеет право). Запуск syslogd (/etc/rc.d/init.d/syslog) д.б. с ключом -r. На клиентских компьютерах конфигурируем syslog так, чтобы все сообщения передавались на syslog-сервер, сообщения о фатальных ошибках дублировались в /var/log/syslog, на консоль и на терминалы пользователей (пока кроме news - как статистику обсчитывать?). На linux также сбрасывать в локальный файл local7 (boot.log).

Журнализация для cisco ведется с facility - local0. Судя по документации:

В реальности:

Журнализация ftpd - local3.

Журнализация account - local4.

Журнализация cyrus POP3/IMAP - local5.

Журнализация для tac_plus ведется с facility - local6 .

Загрузка в linux - local7.

logrotate: хранить вечно, менять версии по возможности реже (ежемесячно, кроме squid), сбрасывать в отдельные директории (кроме squid) и сжимать (в отложенном режиме, кроме ftpd, linuxconf, sendfax), ошибки и удаляемые файлы посылать мне. Привести в соответствие параметры для syslog.

Время от времени syslogd RH 6.0 зависает (то ли нагрузка чрезмерна, то ли SMP гадит) и явный memory leak. Пытался включить запись временных маркеров в отдельный файл (/var/log/time_markers) и регулярную проверку этого файла (check_syslogd.sh). Если записей давно не было, то убивается syslogd и делается /etc/rc.d/init.d/syslog restart (просто restart не срабатывает - зависает при попытке записать в журнал ;). Однако даже зависший syslogd записывает маркеры (но не работает) - пришлось проверять один из обычных журналов. В RH 6.2 memory leak исчез, зависает он теперь не навсегда, а только на пару минут.