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

на главную

Жанры

Основы программирования в 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), должен содержать следующую строку:

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

Решала

Иванов Дмитрий
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала

Все не случайно

Юнина Наталья
Любовные романы:
современные любовные романы
7.10
рейтинг книги
Все не случайно

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Неудержимый. Книга XIV

Боярский Андрей
14. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIV

Жребий некроманта 3

Решетов Евгений Валерьевич
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Жребий некроманта 3

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Real-Rpg. Еретик

Жгулёв Пётр Николаевич
2. Real-Rpg
Фантастика:
фэнтези
8.19
рейтинг книги
Real-Rpg. Еретик

Восход. Солнцев. Книга VI

Скабер Артемий
6. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VI

Действуй, дядя Доктор!

Юнина Наталья
Любовные романы:
короткие любовные романы
6.83
рейтинг книги
Действуй, дядя Доктор!

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Адепт. Том 1. Обучение

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
9.27
рейтинг книги
Адепт. Том 1. Обучение

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд