Основы программирования в 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 определены и другие функции, применяемые для изменения поведения средств ведения системных журналов.
К ним относятся следующие функции:
<b>#include <syslog.h> void closelog(void);</b><b>void openlog(const char *ident, int logopt, int facility);</b><b>int setlogmask(int maskpri);</b>Вы можете изменить способ представления ваших регистрируемых сообщений, вызвав функцию
. Это позволит задать строкуopenlog, которая будет добавляться к вашим регистрируемым сообщениям. Вы можете применять ее для индикации программы, создавшей сообщение. Параметрidentзаписывает текущий принятый по умолчанию тип программы, формирующей сообщение, который будет использоваться в последующих вызовахfacility. По умолчанию устанавливается значениеsyslog. ПараметрLOG_USERнастраивает поведение будущих вызовов функцииlogopt. Он представляет собой результат поразрядной операцииsyslogнулевого или большего числа параметров, приведенных в табл. 4.7.ORТаблица 4.7
Параметр logoptОписание LOG_PIDВключает в сообщения идентификатор процесса, уникальный номер, выделяемый системой каждому процессу LOG_CONSПосылает сообщения на консоль, если они не могут быть записаны LOG_ODELAYОткрывает средство регистрации сообщений при первом вызове функции syslogLOG_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>