Упрощенно, это выглядит примерно так:
Ядро записывает сообщения (используя printk()
функцию) в кольцевой буфер в пространстве ядра. Эти сообщения доступны для приложений пользовательского пространства двумя способами: через /proc/kmsg
файл (при условии, что /proc
он смонтирован) и через sys_syslog
системный вызов.
Есть два основных приложения, которые читают (и в некоторой степени могут контролировать) кольцевой буфер ядра: dmesg(1)
и klogd(8)
. Первый предназначен для запуска по требованию пользователей для печати содержимого кольцевого буфера. Последний - это демон, который читает сообщения /proc/kmsg
(или звонки sys_syslog
, если они /proc
не смонтированы) и отправляет их syslogd(8)
на консоль или на нее. Это охватывает сторону ядра.
В пользовательском пространстве есть syslogd(8)
. Это демон, который прослушивает несколько сокетов домена UNIX (в основном /dev/log
, но могут быть также настроены и другие), и, опционально, UDP-порт 514 для сообщений. Он также получает сообщения от klogd(8)
( syslogd(8)
не волнует /proc/kmsg
). Затем он записывает эти сообщения в некоторые файлы /log
или в именованные каналы или отправляет их на некоторые удаленные хосты (через syslog
протокол, на UDP-порт 514), как настроено в /etc/syslog.conf
.
Приложения пользовательского пространства обычно используют эту libc
функцию syslog(3)
для регистрации сообщений. libc
отправляет эти сообщения в сокет домена UNIX /dev/log
(где они читаются syslogd(8)
), но если приложение chroot(2)
выключено, сообщения могут в конечном итоге быть записаны в другие сокеты, например /var/named/dev/log
. Разумеется, важно, чтобы приложения, отправляющие эти журналы, syslogd(8)
согласовывали расположение этих сокетов. По этой причине syslogd(8)
можно настроить прослушивание дополнительных сокетов помимо стандарта /dev/log
.
Наконец, syslog
протокол - это просто протокол дейтаграмм. Ничто не мешает приложению отправлять дейтаграммы системного журнала в любой сокет домена UNIX (при условии, что его учетные данные позволяют ему открывать сокет), полностью обходя syslog(3)
функцию libc
. Если датаграммы правильно отформатированы, syslogd(8)
можете использовать их, как если бы сообщения были отправлены syslog(3)
.
Конечно, вышесказанное охватывает только «классическую» теорию лесозаготовок. Другие демоны (такие как rsyslog
и syslog-ng
, как вы упомянули) могут заменить обычные syslogd(8)
и выполнять всевозможные изящные операции, такие как отправка сообщений на удаленные хосты через зашифрованные соединения TCP, предоставление временных меток с высоким разрешением и т. Д. И есть также systemd
, что медленно фагоцитирует UNIX часть Linux. systemd
имеет свои собственные механизмы регистрации, но эту историю должен рассказать кто-то другой. :)
Отличия от мира * BSD:
В * BSD его нет klogd(8)
и /proc
не существует (в OpenBSD), или он в основном устарел (в FreeBSD и NetBSD). syslogd(8)
читает сообщения ядра с символьного устройства /dev/klog
и dmesg(1)
использует /dev/kmem
для декодирования имен ядра. Только OpenBSD имеет /dev/log
. FreeBSD использует два сокета домена UNIX /var/run/log
и var/rub/logpriv
вместо этого, и NetBSD имеет /var/run/log
.
rsyslog
не используетklogd(8)
его, потому что его корни уходят очень далеко, а не потому, что недавно он принял явное решение покончить с ним. Моя память может ухудшаться, хотя. Во всяком случае, как я уже сказал, я только пытался охватить «классическую» лесозаготовку.rsyslogd
запущенной и одна Ubuntu 12.04 сsyslog-ng
запущенной, и у них обоих был файл,/proc/kmsg
открытый в соответствии сlsof
, то естьklogd
не использовался. Еще одна интересная вещь, которую я заметил, заключается в том, что сообщения журнала хранятся в/proc/kmsg
файле, если не запущен демон syslog, и их можно просмотреть, например, вcat
текстовом редакторе. Однако эти сообщения можно просмотреть только один раз, поскольку они исчезают после просмотра. И последнее, но не менее важное: выполнениеdmesg
не очищает содержимое/proc/kmsg
файла./proc/kmsg
- это не обычный файл, там ничего не «хранится», скорее это просто просмотр кольцевого буфера ядра. Вы можете прочитать егоcat
именно потому, что у вас нетklogd(8)
работы (если вы запуститеklogd(8)
,cat /proc/kmsg
заблокирует).dmesg(1)
читает сообщения от,/dev/kmsg
а не/proc/kmsg
; и он также может очистить буфер, если вы скажете это.systemd has its own logging mechanisms, but that story would have to be told by somebody else. :)
- Скажите, пожалуйста, у вас есть талант :-)Другой ответ объясняет, как говорит его автор, «классическое ведение журнала» в Linux. В наши дни во многих системах это не так.
Ядро
Механизмы ядра изменились.
Ядро генерирует вывод в буфер в памяти. Прикладные программы могут получить доступ к этому двумя способами. Подсистема журналирования обычно обращается к ней как псевдо-FIFO с именем
/proc/kmsg
. Этот источник информации журнала не может быть полезен для читателей журнала, потому что он доступен для чтения. Если несколько процессов совместно используют его, каждый из них получает только часть потока данных журнала ядра. Это также только для чтения.Другой способ получить к нему доступ - это новое
/dev/kmsg
символьное устройство. Это интерфейс чтения-записи, который может использоваться несколькими клиентскими процессами. Если несколько процессов совместно используют его, все они читают один и тот же полный поток данных, не затронутый друг другом. Если они открывают его для доступа на запись, они также могут вставлять сообщения в поток журнала ядра, как если бы они были сгенерированы ядром./proc/kmsg
и/dev/kmsg
предоставить данные журнала в не RFC-5424 форме.Приложения
Приложения изменились.
Функция библиотеки GNU C
syslog()
в основном пытается подключиться кAF_LOCAL
сокету дейтаграммы с именем/dev/log
и записать в него записи журнала. (Функция библиотеки BSD C вsyslog()
настоящее время использует в/var/run/log
качестве имени сокета и пытается/var/run/logpriv
сначала.) Конечно, приложения могут иметь свой собственный код, чтобы сделать это напрямую. Функция библиотеки - это всего лишь код (для открытия, подключения, записи и закрытия сокета), в конце концов выполняющийся в собственном контексте процесса приложения.Приложения также могут отправлять сообщения RFC 5424 через UDP на локальный сервер RFC 5426, если он прослушивает сокет
AF_INET
/AF_INET6
дейтаграммы на машине.Благодаря давлению со стороны мира daemontools за последние два десятилетия, многие демоны поддерживают работу в режиме, в котором они не используют
syslog()
библиотечную функцию GNU C или UDP-сокеты, а просто выкладывают свои данные журнала в стандартную ошибку в обычная мода Unix.управление журналами с nosh и семьей daemontools в целом
Семейство наборов инструментов daemontools обеспечивает большую гибкость ведения журналов. Но в целом по всей семье идея заключается в том, что у каждого «главного» демона есть связанный «протоколирующий» демон. «главные» демоны работают точно так же, как не-демонные процессы, и записывают свои сообщения журнала в стандартную ошибку (или стандартный вывод), которую подсистема управления службами организует для подключения через канал (который она остается открытой, чтобы данные журнала не терялись перезапуск службы) к стандартному вводу демона «logging».
Все «логи» запускают программы, которые где- то регистрируются . Обычно эта программа является то , как
multilog
илиcyclog
что читает из стандартного ввода и записывает (наносекунды метка время) файлы в строго размере шапок, автоматически поворачивается, исключающая запись, каталог журналов. Как правило, все эти демоны работают под эгидой отдельных выделенных непривилегированных учетных записей пользователей.Таким образом, в итоге получается система распределенной регистрации, в которой данные журнала каждой службы обрабатываются отдельно.
Один может запустить что - то подобное
klogd
илиsyslogd
илиrsyslogd
под руководством службы Daemontools семьи. Но мир daemontools осознал много лет назад, что структура управления сервисами с «ведением журнала» вполне пригодна для более простых действий. Нет необходимости разделять все потоки журналов в одну гигантскую мешанину, анализировать данные журналов, а затем направлять потоки обратно в отдельные файлы журналов; а затем (в некоторых случаях) прикрутите ненадежный механизм вращения внешнего бревна сбоку. Структура семейства daemontools как часть стандартного управления журналами уже выполняет ротацию журналов, запись файлов журналов и разделение потоков.Более того: модель цепной загрузки с отбрасыванием привилегий с помощью инструментов, общих для всех сервисов, означает, что программы регистрации не нуждаются в привилегиях суперпользователя; и модель UCSPI означает, что им нужно заботиться только о различиях, таких как потоки и транспорты датаграмм.
Набор инструментов Nosh иллюстрирует это. В то время как под ним можно запускать «
rsyslogd
из коробки» и просто управлять ядром/run/log
и вводом журнала UDP по-старому; он также предоставляет больше "родных" daemontools способов регистрации этих вещей:klogd
служба , которая читает/proc/kmsg
и пишет просто , что поток журнала в стандартной ошибки. Это делается с помощью простой программы с именемklog-read
. Связанный демон ведения журнала подает поток журнала с его стандартного ввода в/var/log/sv/klogd
каталог журнала.local-syslog-read
служба , которая читает датаграммы/dev/log
(/run/log
на BSDs) и просто пишет , что поток журнала в стандартной ошибки. Это делается с помощью программы с именемsyslog-read
. Связанный демон ведения журнала подает поток журнала с его стандартного ввода в/var/log/sv/local-syslog-read
каталог журнала.udp-syslog-read
сервис , который прослушивает порт UDP системного журнала, читает то , что он отправляется к нему и просто записывает поток , что лог его стандартной ошибки. Опять программа естьsyslog-read
. Связанный демон ведения журнала подает поток журнала с его стандартного ввода в/var/log/sv/udp-syslog-read
каталог журнала.local-priv-syslog-read
служба, которая читает дейтаграммы/run/logpriv
и просто записывает этот поток журнала в свою стандартную ошибку. Опять программа естьsyslog-read
. Связанный демон ведения журнала подает поток журнала с его стандартного ввода в/var/log/sv/local-priv-syslog-read
каталог журнала.В набор инструментов также входит
export-to-rsyslog
инструмент, который может отслеживать один или несколько каталогов журналов (используя систему неинтрузивных курсоров журналов ) и отправлять новые записи в форме RFC 5424 по сети на назначенный сервер RFC 5426.управление журналом с помощью systemd
systemd имеет единую монолитную программу управления журналами
systemd-journald
. Это работает как сервис, управляемый systemd./dev/kmsg
данные журнала ядра./dev/log
(символическую ссылку/run/systemd/journal/dev-log
) для каротажных данных приложения из библиотеки GNU C вsyslog()
функции.AF_LOCAL
потоковый сокет at/run/systemd/journal/stdout
для данных журнала, поступающих от управляемых системой сервисов.AF_LOCAL
сокет дейтаграммы at/run/systemd/journal/socket
для данных журнала, поступающих от программ, которые используют протокол журнала, специфичный для systemd (т.sd_journal_sendv()
Е. И др.)./run/log/journal/
или/var/log/journal/
.AF_LOCAL
сокету дейтаграммы,/run/systemd/journal/syslog
он записывает туда данные журнала, если настроена пересылка в системный журнал./dev/kmsg
механизм записи .Плохие вещи случаются во всей системе, если эта программа падает или служба останавливается.
Сам systemd организует для стандартных выводов и ошибок (некоторых) сервисов, которые будут подключены к
/run/systemd/journal/stdout
сокету. Таким образом, демонам, которые регистрируют стандартную ошибку в обычном порядке, отправляется вывод в журнал.Это полностью заменяет klogd, syslogd, syslog-ng и rsyslogd.
Теперь они должны быть специфичными для systemd. В системе systemd они не становятся серверной частью
/dev/log
. Вместо этого они используют один из двух подходов:/run/systemd/journal/syslog
, к которой (если вы помните)systemd-journald
пытается подключиться и записать данные журнала. Пару лет назад можно было бы настроить методimuxsock
ввода rsyslogd для этого.imjournal
ввода rsyslogd .источник