37.5.2. Программный интерфейс syslog

Программный интерфейс syslog состоит из трех основных функций.

• Функция openlog() устанавливает настройки, которые по умолчанию применяются ко всем последующим вызовам syslog(). Она не является обязательной. Если ею не воспользоваться, соединение с системой ведения журнала устанавливается при первом вызове syslog() на основе стандартных настроек.

• Функция syslog() записывает сообщения в журнал.

• Функция closelog() вызывается после окончания записи сообщений, чтобы разорвать соединение с журналом.

Ни одна из этих функций не возвращает значение статуса. Частично это продиктовано тем, что системное журналирование должно быть всегда доступным (если оно перестанет работать, системный администратор должен быстро это заметить). Кроме того, если при ведении журнала произошла ошибка, приложение обычно мало что может сделать, чтобы об этом сообщить.

Библиотека GNU C также предоставляет функцию void vsyslog(int priority, const char *format, va_list args), которая делает то же, что и syslog(), но принимает список аргументов, предварительно обработанных интерфейсом stdarg(3) (таким образом, vsyslog() и syslog() соотносятся как vprintf() и printf()). Функция vsyslog() не входит в стандарт SUSv3 и доступна не во всех UNIX-системах.

Установление соединения с системным журналом

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

#include

void openlog(const char *ident, int log_options, int facility);

Аргумент ident является указателем на строку, которая добавляется в каждое сообщение, записываемое с помощью syslog(); обычно это название программы. Стоит отметить, что openlog() всего лишь копирует значение этого указателя. Продолжая использовать вызовы syslog(), приложение должно следить за тем, чтобы строка, на которую ссылается данный аргумент, не изменилась.

Если в качестве аргумента ident указать NULL, интерфейс syslog из состава glibc, как и некоторые другие реализации, будет автоматически подставлять вместо него название программы. Однако такое поведение не предусмотрено стандартом SUSv3 и не выполняется в некоторых системах, поэтому переносимые приложения не должны на него полагаться.

Аргумент log_options для вызова openlog() представляет собой битовую маску, состоящую из любых комбинаций следующих констант, к которым применяется побитовое ИЛИ.

• LOG_CONS — если в системный журнал приходит ошибка, она записывается в системную консоль (/dev/console).

• LOG_NDELAY — соединение с системой ведения журнала (то есть с сокетом домена UNIX, /dev/log) устанавливается немедленно. По умолчанию (LOG_ODELAY) это происходит, только когда (и если) первое сообщение попадает в журнал с помощью вызова syslog(). Флаг O_NDELAY может пригодиться в программах, которым нужно контролировать момент выделения файлового дескриптора для /dev/log. Например, это может быть приложение, которое вызывает chroot(); после этого вызова путь /dev/log перестает быть доступным, поэтому, если вы вызываете функцию openlog() с флагом LOG_NDELAY, это нужно делать до chroot(). Примером программы, которая использует флаг LOG_NDELAY таким образом, может служить демон tftpd (Trivial File Transfer).

• LOG_NOWAIT — вызов syslog() не ждет дочерний процесс, который мог быть создан для записи сообщения в журнал. Этот флаг нужен в приложениях, в которых для записи сообщений используются отдельные дочерние процессы. Он позволяет вызову syslog() избежать ожидания потомков, которые уже были утилизированы родителем, который тоже их ожидал. В Linux флаг LOG_NOWAIT ни на что не влияет, так как в это системе при записи сообщений в журнал дочерние процессы не создаются.

• LOG_ODELAY — противоположность флагу LOG_NDELAY. Соединение с системой ведения журнала откладывается до тех пор, пока не будет записано первое сообщение. Этот флаг используется по умолчанию и его не нужно указывать отдельно.

• LOG_PERROR — сообщения попадают не только в системный журнал, но и в стандартный поток ошибок. Обычно демоны закрывают этот поток или перенаправляют его в /dev/null; в этом случае флаг LOG_PERROR ни на что не влияет.

• LOG_PID — вместе с каждым сообщением записывается идентификатор вызывающего процесса. Использование этого флага в сервере, который создает множество потомков, позволяет понять, какой из процессов записал то или иное сообщение.

Все константы, приведенные выше, входят в стандарт SUSv3. Исключение составляет константа LOG_PERROR, которая поддерживается во многих (но не всех) системах UNIX.

Аргумент facility в функции openlog() обозначает категорию, которая по умолчанию будет использоваться во всех последующих вызовах syslog(). Возможные значения этого аргумента перечислены в табл. 37.1.

Перейти на страницу:

Похожие книги