В табл. 4.6 перечислены степени важности сообщений в порядке убывания приоритета.
Таблица 4.6
Приоритет |
Описание |
LOG_EMERG |
Кризисная ситуация |
LOG_ALERT |
Проблема с высоким приоритетом, например, повреждение базы данных |
LOG_CRIT |
Критическая ошибка, например, повреждение оборудования |
LOG_ERR |
Ошибки |
LOG_WARNING |
Предупреждение |
LOG_NOTICE |
Особые обстоятельства, требующие повышенного внимания |
LOG_INFO |
Информационные сообщения |
LOG_DEBUG |
Отладочные сообщения |
В зависимости от настройки системы сообщения типа LOG_EMER
могут пересылаться всем пользователям системы, сообщения LOG_ALERT
могут отправляться по электронной почте администратору, сообщения LOG_DEBUG
могут игнорироваться, а сообщения других типов могут записываться в файл. Вы можете написать программу, которая применяет средство регистрации сообщений, просто вызывая функцию syslog
, когда вы хотите создать регистрируемое сообщение.
У сообщения, создаваемого syslog
, есть заголовок и тело сообщения. Заголовок создается из индикатора типа программы, формирующей сообщение, и даты и времени. Тело сообщения создается из параметра message
, передаваемого функции syslog
, который действует как строка format
функции printf
. Остальные аргументы syslog
используются в соответствии со спецификаторами преобразований в стиле функции printf
, заданными в строке message
. Дополнительно может применяться спецификатор %m
для включения строки сообщения об ошибке, ассоциированной с текущим значением переменной errno
. Эта возможность может оказаться полезной для регистрации сообщений об ошибках.
Выполните упражнение 4.13.
Упражнение 4.13. Применение функции syslog
В этой программе осуществляется попытка открыть несуществующий файл.
#include
#include
#include
int main() {
FILE *f;
f = fopen("not_here", "r");
if (!f) syslog(LOG_ERR|LOG_USER, "oops - %m\n");
exit(0);
}
Когда вы откомпилируете и выполните программу syslog.с, то не увидите никакого вывода, но в конце файла /var/log/messages теперь содержится следующая строка:
Jun 9 09:24:50 suse103 syslog: oops — No such file or directory
Как это работает
В данной программе вы пытаетесь открыть файл, которого нет. Когда попытка заканчивается неудачно, вы вызываете функцию syslog
для записи случившегося в системный журнал.
Обратите внимание на то, что регистрируемое сообщение не указывает, какая программа вызвала средство регистрации; оно просто констатирует тот факт, что была вызвана функция syslog
с сообщением. Спецификатор преобразования %m
был заменен описанием ошибки, в данном случае сообщающим об отсутствии файла. Это гораздо полезнее, чем простой отчет, содержащий внутренний номер ошибки.
В файле syslog.h определены и другие функции, применяемые для изменения поведения средств ведения системных журналов.
К ним относятся следующие функции:
#include void closelog(void);
void openlog(const char *ident, int logopt, int facility);
int setlogmask(int maskpri);
Вы можете изменить способ представления ваших регистрируемых сообщений, вызвав функцию openlog
. Это позволит задать строку ident
, которая будет добавляться к вашим регистрируемым сообщениям. Вы можете применять ее для индикации программы, создавшей сообщение. Параметр facility
записывает текущий принятый по умолчанию тип программы, формирующей сообщение, который будет использоваться в последующих вызовах syslog
. По умолчанию устанавливается значение LOG_USER
. Параметр logopt
настраивает поведение будущих вызовов функции syslog
. Он представляет собой результат поразрядной операции OR
нулевого или большего числа параметров, приведенных в табл. 4.7.
Таблица 4.7
Параметр logopt |
Описание |
LOG_PID |
Включает в сообщения идентификатор процесса, уникальный номер, выделяемый системой каждому процессу |
LOG_CONS |
Посылает сообщения на консоль, если они не могут быть записаны |
LOG_ODELAY |
Открывает средство регистрации сообщений при первом вызове функции syslog |
LOG_NDELAY |
Открывает средство регистрации сообщений немедленно, не дожидаясь первого регистрируемого сообщения |
Функция openlog
выделит и откроет дескриптор файла, который будет применяться для записи в программе ведения системного журнала. Вы сможете закрыть его, вызвав функцию closelog
. Имейте в виду, что вам не нужно вызывать функцию openlog
перед вызовом syslog
, потому что последняя при необходимости самостоятельно откроет средство ведения системного журнала.
Читать дальше