Другой ответ объясняет, как говорит его автор, «классическое ведение журнала» в 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
каталог журнала.
- (на BSD)
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 для этого.
- Они читают напрямую из журнала systemd, используя специфичную для systemd библиотеку, которая понимает двоичный формат журнала и может отслеживать файлы журнала и каталог для добавления новых записей. В настоящее время для этого нужно настроить метод
imjournal
ввода rsyslogd .