Вы можете изменить способ представления ваших регистрируемых сообщений, вызвав функцию openlog
. Это позволит задать строку ident
, которая будет добавляться к вашим регистрируемым сообщениям. Вы можете применять ее для индикации программы, создавшей сообщение. Параметр facility
записывает текущий принятый по умолчанию тип программы, формирующей сообщение, который будет использоваться в последующих вызовах syslog
. По умолчанию устанавливается значение LOG_USER
. Параметр logopt
настраивает поведение будущих вызовов функции syslog
. Он представляет собой результат поразрядной операции OR
нулевого или большего числа параметров, приведенных в табл. 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.
logmask
)В этом примере вы увидите logmask
в действии.
#include
#include
#include
#include
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), должен содержать следующую строку:
Jun 9 09:28:52 susel03 logmask[19339]: debug message, should appear
Как это работает
Программа инициализирует средство ведения системного журнала, названное logmask, и запрашивает включение идентификатора процесса в регистрируемые сообщения. Информирующее сообщение записывается в файл /var/log/messages, а отладочное сообщение — в файл /var/log/debug. Второе отладочное сообщение не появляется, потому что вы вызвали функцию setlogmask
с игнорированием всех сообщений с приоритетом ниже LOG_NOTICE
. (Учтите, что этот метод не работает в ранних вариантах ядра Linux.)
Если в установленную у вас систему не включена регистрация отладочных сообщений или она настроена иначе, отладочные сообщения могут не появляться. Для разблокирования всех отладочных сообщений и для получения подробностей настройки см. системную документацию, посвященную функции syslog
или syslog-ng
.
Программа logmask.c также использует функцию getpid
, которая, наряду с тесно связанной с ней функцией getppid
, определена следующим образом:
#include
#include