UNIX: разработка сетевых приложений
ПРИМЕЧАНИЕБолее новые реализации отключают возможность создания сокета UDP, если она не задана администратором, поскольку если позволить кому угодно отправлять дейтаграммы UDP на этот порт (возможно, заполняя приемный буфер его сокета), это может привести к тому, что законные сообщения не будут получены (атака типа отказ в обслуживании) или переполнится файловая система из-за неограниченного роста журналов.
Между реализациями демона syslogd существуют различия. Например, доменные сокеты Unix используются Беркли-реализациями, а реализации System V используют потоковый драйвер (streams log driver). Различные реализации, происходящие от Беркли, используют для доменных сокетов Unix различные полные имена. Мы можем игнорировать все эти тонкости, если используем функцию syslog.
Мы можем отправлять сообщения о событиях для записи в журнал (log messages) демону
из наших демонов, создав дейтаграммный доменный сокет Unix и указывая при отправке полное имя, с которым связан демон, но более простым интерфейсом является функцияsyslogd, которую мы описываем в следующем разделе. В качестве альтернативы мы можем создать сокет UDP и отправлять наши сообщения на адрес закольцовки и порт 514.syslog13.3. Функция syslog
Поскольку у демона нет управляющего терминала, он не может просто вызвать функцию
для вывода в стандартный поток сообщений об ошибках (fprintf). Обычная техника записи в журнал сообщений для демона — это вызов функцииstderr.syslog#include <syslog.h>void syslog(int <i>priority</i>, const char *<i>message</i>, ...);Хотя эта функция изначально разрабатывалась для BSD, в настоящее время она предоставляется большинством производителей систем Unix. Описание
в POSIX соответствует тому, что мы пишем здесь. RFC 3164 содержит документацию, касающуюся протоколаsyslogBSD.syslogАргумент
— это комбинация аргументовpriorityиlevel, которые мы показываем в табл. 13.1 и 13.2. Дополнительные сведения об этом аргументе можно найти в RFC 3164. Аргументfacilityаналогичен строке формата функцииmessageс добавлением спецификацииprintf, которая заменяется сообщением об ошибке, соответствующим текущему значению переменной%m. Символ перевода строки может появиться в конце строкиerrno, но он не является обязательным.messageСообщения для журнала имеют значение
(уровень) от 0 до 7, что мы показываем в табл. 13.1. Это упорядоченные значения. Если отправитель не задает значениеlevel, используется значение по умолчаниюlevel.LOG_NOTICEТаблица 13.1. Аргумент level журнальных сообщений
Level Значение Описание LOG_EMERG 0 Система не может функционировать, экстренная ситуация (наивысший приоритет) LOG_ALERT 1 Следует немедленно принять меры, срочная ситуация LOG_CRIT 2 Критическая ситуация LOG_ERR 3 Состояние ошибки LOG_WARNING 4 Предупреждение LOG_NOTICE 5 Необычное, хотя и не ошибочное состояние (значение аргумента level по умолчанию) LOG_INFO 6 Информационное сообщение LOG_DEBUG 7 Отладочные сообщения (низший приоритет) Сообщения также содержат аргумент
для идентификации типа процесса, посылающего сообщение. Мы показываем его различные значения в табл. 13.2. Если не задано значение аргументаfacility, используется его значение по умолчанию —facility.LOG_USERТаблица 13.2. Аргумент facility журнальных сообщений
facility Описание LOG_AUTH Сообщения no безопасности/авторизации LOG_AUTHPRIV Сообщения по безопасности/авторизации (частные) LOG_CRON Демон cron LOG_DAEMON Системные демоны LOG_FTP Демон FTP LOG_KERN Сообщения ядра LOG_LOCAL0 Локальное использование LOG_LOCAL1 Локальное использование LOG_LOCAL2 Локальное использование LOG_LOCAL3 Локальное использование LOG_LOCAL4 Локальное использование LOG_LOCAL5 Локальное использование LOG_LOCAL6 Локальное использование LOG_LOCAL7 Локальное использование LOG_LPR Демон принтера LOG_MAIL Почтовая система LOG_NEWS Система телеконференций LOG_SYSLOG Внутренние сообщения системы syslog LOG_USER Сообщения пользовательского уровня (значение аргумента facility по умолчанию) LOG_UUCP Система UUCP