Как демоны выполняют логгирование?
При написании демона одной из проблем является вывод сообщений об ошибках. Поскольку его выполнение происходит в фоновом режиме, он не может просто выводить информацию в терминал, как это делают другие программы (для того, чтобы освежить в памяти понимание демонов, отсылаю вас на ранний
пост).
Так вот, в качестве альтернативы сообщения можно записывать в отдельный журнальный файл программы. Основной недостаток такого подхода заключается в сложности менеджмента этих файлов. Для решения проблемы была разработана система
syslog.
Что такое syslog?
Система
syslog предоставляет единый централизованный механизм, который позволяет любому приложению записывать свои сообщения в единый журнал. Система
syslog состоит из двух основных компонентов: демона
syslogd и библиотечной функции
syslog().
Демон
syslogd, принимает сообщения из двух разных источников: сокета UNIX-домена (
/dev/log), который хранит сообщения, сгенерированные локально, и сокета интернет-домена, который хранит сообщения, отправленные по TCP/IP.
Для записи сообщений в журнал любой процесс может воспользоваться библиотечной функцией
syslog(). На основе переданных ей аргументов она создает сообщение и помещает его в сокет "
/dev/log", где оно будет доступно для
syslogd.
Файл /etc/syslog.conf
Конфигурационный файл "
/etc/syslog.conf" определяет поведение демона
syslogd и то, как и куда должны записываться системные сообщения. Он состоит из набора правил, которые имеют следующий вид:
источник.приоритет действие
# Записывать все сообщения от ядра в файл kern.log
kern.* /var/log/kern.log
Программный интерфейс syslog
Программный интерфейс
syslog состоит из трех основных функций, которые входят в пространство "
syslog.h":
1. Функция
openlog() устанавливает настройки, которые по умолчанию применяются ко всем последующим вызовам
syslog():
void openlog(const char *ident, int log_options, int facility);
openlog("slog", LOG_PID|LOG_CONS, LOG_DAEMON);
2. Функция
syslog() записывает сообщения в журнал:
void syslog(int priority, const char *format, ...);
syslog(LOG_INFO, "Hello world ... ");
3. Функция
closelog() вызывается после окончания записи сообщений, чтобы разорвать соединение с журналом:
void closelog(void);
Если не прорабатывать конфиги и не указывать альтернативные пути вывода сообщений для различных источников, то последовательное выполнение функций выше приведет к появлению лога в файле "
/var/log/syslog":
xodefenderpc slog[754521]: Hello world ...
Linux++ | IT-Образование