Вы находитесь на странице: 1из 6

Протокол Syslog

Syslog – стандарт логирования, протокол, использующийся в unix-подобных ОС, а также на


различном оборудовании (маршрутизаторы, коммутаторы и т.д.). Протокол syslog описан в
RFC5424. Предоставляет возможность использования отдельного ПО для генерации
сообщений, передачи сообщений, получения сообщений и хранения сообщений. Syslog – это
протокол, определяющий формат сообщения и разделение ПО, реализующего syslog, по
функциональному признаку:
• Originator – источник сообщения
• Relay – передатчик сообщения
• Reciever – получатель сообщения

Эти компоненты могут находиться, как на одной системе, так и разнесены по различным
системам, соединенным сетью. Таким образом, протокол syslog может использоваться для
централизации сбора и хранения логов с различных систем. Для перечи данных по сети в
качестве транспорта может использовать UDP, TCP, TLS (рекомендуется).

Некоторые из возможных топологий:


В стандарте определен только формат сообщения, но не определен способ его хранения, что
дает возможность ПО, реализующему syslog, хранить сообщения где угодно (файлы,
локальные и удаленные СУБД, передача другому syslog и т.д.).

Каждому сообщению присваивается facility (код источника), обозначающий тип ПО,


сгенерировавшего сообщение. Также каждому сообщению присваивается метка severity
(критичность).

Определенные стандартом facility:

Facility code Keyword Description


0 kern kernel messages
1 user user-level messages
2 mail mail system
3 daemon system daemons
4 auth security/authorization messages
5 syslog messages generated internally
by syslogd
6 lpr line printer subsystem
7 news network news subsystem
8 uucp UUCP subsystem
9 - clock daemon
10 authpriv security/authorization messages
11 - FTP daemon
12 - NTP subsystem
13 - log audit
14 - log alert
15 cron scheduling daemon
16 local0 local use 0 (local0)
17 local1 local use 1 (local1)
18 local2 local use 2 (local2)
19 local3 local use 3 (local3)
20 local4 local use 4 (local4)
21 local5 local use 5 (local5)
22 local6 local use 6 (local6)
23 local7 local use 7 (local7)

Определенные стандартом severity:

Value Severity Keyword Description Examples


0 Emergency emerg System is unusable This level should not be
used by applications.
1 Alert alert Should be corrected Loss of the primary ISP
immediately connection.

2 Critical crit Critical conditions A failure in the system's


primary application.
3 Error err Error conditions An application has
exceeded its file storage
limit and attempts to write
are failing.
4 Warning warning May indicate that an error A non-root file system has
will occur if action is not only 2GB remaining.
taken.
5 Notice notice Events that are unusual, An application has started,
but not error conditions. paused or ended
successfully.
6 Informational info Normal operational
messages that require no
action.
7 Debug debug Information useful to
developers for debugging
the application.

Для того, чтобы отправить сообщение syslog-демону пользовательские программы Linux


используют GNU C Library – стандартную библиотеку проекта GNU, входящую в
дистрибутив RHEL и предоставляющую фунции для отправки syslog-сообщений: openlog(),
closelog(), syslog().

Пример использования:
#include <syslog.h>
setlogmask (LOG_UPTO (LOG_NOTICE));
openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
syslog (LOG_NOTICE, "Program started by User %d", getuid ());
syslog (LOG_INFO, "A tree falls in a forest");
closelog ();

При вызове библиотечной функции syslog() будет произведена запись заданного сообщения в
системный сокет /dev/log.

Как правило, при старте системы автоматически запускается syslog-демон (например,


rsyslog), который прослушивает сокет /dev/log.

Таким образом, пользовательские программы имеют возможность отправки сообщений


syslog-демону.

Однако, вышеуказанным образом работают только пользовательские программы. Ядро Linux


не взаимодействует само с syslog-демоном. Оно отправляет свои сообщения в кольцевой
буфер /dev/kmsg, откуда они извлекаются демоном klogd и отправляются демону syslog. Поле
facility этих сообщений всегда равно 0 (kern). Отправить сообщение с facility=kern
пользовательские программы, использующий функцию syslog(), не могут.

Источники:
• https://en.wikipedia.org/wiki/Syslog
• https://tools.ietf.org/html/rfc5424
• https://tools.ietf.org/html/rfc5426
• https://tools.ietf.org/html/rfc5246
• «The GNU C Library Reference Manual», chapter 18 – Syslog
• http://unix.stackexchange.com/questions/205883/understand-logging-in-linux

Приложение 1 — Отличный ответ на вопрос о том, как происходит логирование в Linux

http://unix.stackexchange.com/questions/205883/understand-logging-in-linux

Question: As I understand, Linux kernel logs to /proc/kmsg file(mostly hardware-related


messages) and /dev/log socket? Anywhere else? Are other applications also able to send
messages to /proc/kmsg or /dev/log? Last but not least, am I correct that it is the syslog
daemon(rsyslog,syslog-ng) which checks messages from those two places and then distributes
those to various files like /var/log/messages or /var/log/kern.log or even central syslog server?
Answer:
Simplified, it goes more or less like this:
The kernel logs messages (using the printk() function) to a ring buffer in kernel space. These
messages are made available to user-space applications in two ways: via the /proc/kmsg file
(provided that /proc is mounted), and via the sys_syslog syscall.
There are two main applications that read (and, to some extent, can control) the kernel's ring
buffer: dmesg(1) and klogd(8). The former is intended to be run on demand by users, to print the
contents of the ring buffer. The latter is a daemon that reads the messages from /proc/kmsg (or
calls sys_syslog, if /proc is not mounted) and sends them to syslogd(8), or to the console. That
covers the kernel side.
In user space, there's syslogd(8). This is a daemon that listens on a number of UNIX domain sockets
(mainly /dev/log, but others can be configured too), and optionally to the UDP port 514 for
messages. It also receives messages from klogd(8) (syslogd(8) doesn't care about /proc/kmsg). It
then writes these messages to some files in /log, or to named pipes, or sends them to some remote
hosts (via the syslog protocol, on UDP port 514), as configured in /etc/syslog.conf.
User-space applications normally use the libc function syslog(3) to log messages. libc sends these
messages to the UNIX domain socket /dev/log (where they are read by syslogd(8)), but if an
application is chroot(2)-ed the messages might end up being written to other sockets, f.i.
to /var/named/dev/log. It is, of course, essential for the applications sending these logs
and syslogd(8) to agree on the location of these sockets. For these reason syslogd(8) can be
configured to listen to additional sockets aside from the standard /dev/log.
Finally, the syslog protocol is just a datagram protocol. Nothing stops an application from sending
syslog datagrams to any UNIX domain socket (provided that its credentials allows it to open the
socket), bypassing the syslog(3) function in libc completely. If the datagrams are correctly
formatted syslogd(8) can use them as if the messages were sent through syslog(3).
Of course, the above covers only the "classic" logging theory. Other daemons (such
as rsyslog andsyslog-ng, as you mention) can replace the plain syslogd(8), and do all sorts of nifty
things, like send messages to remote hosts via encrypted TCP connections, provide high resolution
timestamps, and so on. And there's also systemd, that is slowly phagocytosing the UNIX part of
Linux. systemdhas its own logging mechanisms, but that story would have to be told by somebody
else. :)
Differences with the *BSD world:
On *BSD there is no klogd(8), and /proc either doesn't exist (on OpenBSD) or is mostly obsolete
(on FreeBSD and NetBSD). syslogd(8) reads kernel messages from the character device /dev/klog,
and dmesg(1) uses /dev/kmem to decode kernel names. Only OpenBSD has a /dev/log. FreeBSD
uses two UNIX domain sockets /var/run/log and var/rub/logpriv instead, and NetBSD has
a /var/run/log.

Приложение 2 — Пример написания программы, использующей syslog

Для написания простейшей программы, отправляющей сообщение syslog-демону:


1. Логинимся в ОС
2. Создаем файл hellosyslog.c со следующим содержимым:
#include <stdio.h>
#include <unistd.h>
#include <syslog.h>

int main(void) {

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


syslog(LOG_INFO, "A different kind of Hello world ... ");
closelog();

return 0;
}
3. Компилируем файл: gcc -o hellosyslog hellosyslog.c. На выходе получим бинарный
файл hellosyslog:

4. Запускаем программу hellosyslog


5. Смотрим файл /var/log/messages:

Вам также может понравиться