Несмотря на то, что формат и хранение системных сообщений могут отличаться, метод формирования сообщений стандартный. В спецификации UNIX представлен доступный всем программам интерфейс формирования регистрируемых сообщений с помощью функции syslog
.
#include
void syslog(int priority, const char *message, arguments...);
Функция syslog посылает регистрируемое сообщение средству ведения системного журнала (logging facility). У каждого сообщения есть аргумент priority
, полученный поразрядной операцией OR
из степени важности сообщения (severity level) и типа программы, формирующей сообщение (facility value). Степень важности определяет необходимые действия, а тип программы фиксирует инициатора сообщения.
Типы программ (из файла syslog.h) включают константу LOG_USER
, применяемую для обозначения сообщения, пришедшего из приложения пользователя (по умолчанию), и константы LOG_LOCAL0
, LOG_LOCAL1
, ..., LOG_LOCAL7
, зарезервированные для локального администратора.
В табл. 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.
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 openlog(const char *ident, int logopt, int facility);
int setlogmask(int maskpri);