Книга: UNIX: разработка сетевых приложений
13.3. Функция syslog
13.3. Функция syslog
Поскольку у демона нет управляющего терминала, он не может просто вызвать функцию fprintf
для вывода в стандартный поток сообщений об ошибках (stderr
). Обычная техника записи в журнал сообщений для демона — это вызов функции syslog
.
#include <syslog.h>
void syslog(int priority, const char *message, ...);
Хотя эта функция изначально разрабатывалась для BSD, в настоящее время она предоставляется большинством производителей систем Unix. Описание syslog
в POSIX соответствует тому, что мы пишем здесь. RFC 3164 содержит документацию, касающуюся протокола syslog
BSD.
Аргумент priority
— это комбинация аргументов level
и facility
, которые мы показываем в табл. 13.1 и 13.2. Дополнительные сведения об этом аргументе можно найти в RFC 3164. Аргумент message
аналогичен строке формата функции printf
с добавлением спецификации %m
, которая заменяется сообщением об ошибке, соответствующим текущему значению переменной errno
. Символ перевода строки может появиться в конце строки message
, но он не является обязательным.
Сообщения для журнала имеют значение level
(уровень) от 0 до 7, что мы показываем в табл. 13.1. Это упорядоченные значения. Если отправитель не задает значение 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 | Отладочные сообщения (низший приоритет) |
Сообщения также содержат аргумент facility
для идентификации типа процесса, посылающего сообщение. Мы показываем его различные значения в табл. 13.2. Если не задано значение аргумента 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 |
Например, демон может сделать следующий вызов, когда вызов функции rename
неожиданно оказывается неудачным:
syslog(LOG_INFO|LOG_LOCAL2, "rename(%s, %s): %m", file1, file2);
Назначение аргументов facility
и level
в том, чтобы все сообщения, которые посылаются процессами определенного типа (то есть с одним значением аргумента facility
), могли обрабатываться одинаково в файле /etc/syslog.conf
или чтобы все сообщения одного уровня (с одинаковым значением аргумента level
) обрабатывались одинаково. Например, файл конфигурации может содержать строки
kern.* /dev/console
local7.debug /var/log/cisco.log
для указания, что все сообщения ядра направляются на консоль, а сообщения относительно отладки со значением аргумента facility
, равным local7
, добавляются в файл /var/log/cisco.log
.
Когда приложение впервые вызывает функцию syslog
, она создает дейтаграммный доменный сокет Unix и затем вызывает функцию connect
для сокета с заранее известным полным именем, которое создано демоном syslogd
(например, /var/run/log
). Этот сокет остается открытым, пока процесс не завершится. Другим вариантом является вызов процессом функций openlog
и closelog
.
#include <syslog.h>
void openlog(const char *ident, int options, int facility);
void closelog(void);
Функция openlog
может быть вызвана перед первым вызовом функции syslog
, а функция closelog
— когда приложение закончит отправлять сообщения в журнал.
Аргумент ident
— это строка, которая будет добавлена в начало каждого журнального сообщения функцией syslog
. Часто это имя программы.
Обычно аргумент options
формируется путем применения операции логического ИЛИ к константам из табл. 13.3.
Таблица 13.3. Аргумент options (параметр) для функции openlog
Параметр | Описание |
---|---|
LOG_CONS | Выводить журнал на консоль, если невозможно послать сообщение демону syslogd |
LOG_NDELAY | Не откладывать создание сокета, открыть его сейчас |
LOG_PERROR | Записывать сообщение в stderr, а также посылать его демону syslogd |
LOG_PID | Включать идентификатор процесса (PID) в каждую запись журнала |
Обычно доменный сокет Unix не создается при вызове функции openlog
. Вместо этого сокет открывается при первом вызове функции syslog
. Параметр LOG_NDELAY
указывает, что сокет должен создаваться при вызове функции openlog
.
Аргумент facility
функции openlog
задает значение facility
, используемое по умолчанию для любого последующего вызова функции syslog
, при котором не задается аргумент facility
. Некоторые демоны вызывают функцию openlog
и задают значение аргумента facility
(которое обычно не изменяется для данного демона) и затем в каждом вызове функции syslog
задают только аргумент level
(поскольку level
может изменяться в зависимости от ошибки).
Сообщения для записи в журнал могут также генерироваться командой logger
. Это может использоваться в сценариях интерпретатора команд, например для отправки сообщений демону syslogd
.
- 13.2. Демон syslogd
- Функция printk()
- 2.1.3. Функция getopt_long()
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- Функция strcmp( )
- Управление функциями узла
- Функция программного обеспечения
- 3.2. Ключи типа key_t и функция ftok
- 9.10. Функция sctp_recvmsg
- Листинг 12.3. Файл конфигурации программы syslogd
- Функция document