Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

В зависимости от настройки системы сообщения типа

LOG_EMER
могут пересылаться всем пользователям системы, сообщения
LOG_ALERT
могут отправляться по электронной почте администратору, сообщения
LOG_DEBUG
могут игнорироваться, а сообщения других типов могут записываться в файл. Вы можете написать программу, которая применяет средство регистрации сообщений, просто вызывая функцию
syslog
, когда вы хотите создать регистрируемое сообщение.

У сообщения, создаваемого

syslog
, есть заголовок и тело сообщения. Заголовок создается из индикатора типа программы, формирующей сообщение, и даты и времени. Тело сообщения создается из параметра
message
,
передаваемого функции
syslog
, который действует как строка
format
функции
printf
. Остальные аргументы
syslog
используются в соответствии со спецификаторами преобразований в стиле функции
printf
, заданными в строке
message
. Дополнительно может применяться спецификатор
%m
для включения строки сообщения об ошибке, ассоциированной с текущим значением переменной
errno
. Эта возможность может оказаться полезной для регистрации сообщений об ошибках.

Выполните упражнение 4.13.

Упражнение 4.13. Применение функции
syslog

В этой программе осуществляется попытка открыть несуществующий файл.

#include <syslog.h>

#include <stdio.h>

#include <stdlib.h>

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 <syslog.h> 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
, потому что последняя при необходимости самостоятельно откроет средство ведения системного журнала.

Вы можете управлять приоритетом регистрируемых вами сообщений с помощью установки маски регистрации, используя функцию

setlogmask
. Все будущие вызовы
syslog
с разными приоритетами, не заданными в маске регистрации, будут отброшены, таким образом, вы сможете, например, использовать маску для отключения сообщений типа
LOG_DEBUG
без необходимости изменять тело программы.

Вы можете создать маску для регистрируемых сообщений, используя значение

LOG_MASK(priority)
, создающее маску только для одного приоритета, или значение
LOG_UPTO(priority)
, создающее маску для всех приоритетов вплоть до заданного.

Выполните упражнение 4.14.

Упражнение 4.14. Маска регистрации (
logmask
)

В этом примере вы увидите

logmask
в действии.

#include <syslog.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

int main {

 int logmask;

 openlog("logmask", LOG_PID|LOG_CONS, LOG_USER);

 syslog(LOG_INFO, "informative message, pid = %d", getpid);

 syslog(LOG_DEBUG, "debug message, should appear");

 logmask = setlogmask(LOG_UPTO(LOG_NOTICE));

 syslog(LOG_DEBUG, "debug message, should not appear");

exit(0);

}

Программа logmask.c ничего не выводит, но в типичной системе Linux вы увидите в файле /var/log/messages, ближе к концу, следующую строку:

Jun 9 09:28:52 suse103 logmask[19339] : informative message, pid = 19339

Файл, настроенный на получение регистрируемых сообщений об отладке (в зависимости от настройки регистрации, это чаще всего файл /var/log/debug или иногда файл /var/log/messages), должен содержать следующую строку:

Поделиться:
Популярные книги

Черный маг императора

Герда Александр
1. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Законы Рода. Том 7

Андрей Мельник
7. Граф Берестьев
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 7

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2

Искатель 2

Шиленко Сергей
2. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 2

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Развод с драконом. Отвергнутая целительница

Шашкова Алена
Фантастика:
фэнтези
4.75
рейтинг книги
Развод с драконом. Отвергнутая целительница

Газлайтер. Том 26

Володин Григорий Григорьевич
26. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 26

Как я строил магическую империю 6

Зубов Константин
6. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 6

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

Владыка морей ч.1

Чайка Дмитрий
10. Третий Рим
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Владыка морей ч.1

Император Пограничья 9

Астахов Евгений Евгеньевич
9. Император Пограничья
Фантастика:
городское фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 9

Зодчий. Книга I

Погуляй Юрий Александрович
1. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга I