Інша відповідь пояснює, як каже її автор, "класичний журнал" в Linux. Це не так, як зараз працюють у багатьох системах.
Ядро
Механізми ядра змінилися.
Ядро генерує вихід в буфер пам'яті. Програмне забезпечення додатків може отримати доступ до цього двома способами. Підсистема ведення журналу зазвичай отримує доступ до неї як псевдо-FIFO з назвою /proc/kmsg
. Це джерело інформації журналу не може бути корисним для спільного використання серед читачів журналів, оскільки воно читається один раз. Якщо декілька процесів поділяють його, кожен отримує лише частину потоку даних журналу ядра. Це також лише для читання.
Інший спосіб отримати доступ до нього - це новий /dev/kmsg
пристрій символів. Це інтерфейс читання-запису, який можна поділити серед декількох клієнтських процесів. Якщо багато процесів поділяють його, усі вони зчитують один і той же повний потік даних, не впливаючи один на одного. Якщо вони відкриють його для доступу до запису, вони також можуть вводити повідомлення в потік журналу ядра, як якщо б вони були створені ядром.
/proc/kmsg
і /dev/kmsg
надати дані журналу у формі, яка не є RFC-5424.
Програми
Заявки змінилися.
Функція бібліотеки GNU C syslog()
в головних спробах підключитися до AF_LOCAL
сокета дейтаграми з ім'ям /dev/log
і записати в нього записи журналу. (Сьогодні syslog()
функція бібліотеки BSD C використовується /var/run/log
як ім'я сокета і намагається /var/run/logpriv
спочатку.) Програми, звичайно, можуть мати власний код, щоб це зробити безпосередньо. Функція бібліотеки - це просто код (для відкриття, підключення, запису та закриття сокета), що виконується в контексті власного процесу програми.
Програми також можуть надсилати повідомлення RFC 5424 через UDP на локальний сервер RFC 5426, якщо хтось слухає в гнізді AF_INET
/ AF_INET6
дейтаграмі на пристрої.
Завдяки тиску з боку daemontools протягом останніх двох десятиліть, багато dæmons підтримують роботу в режимі, коли вони не використовують syslog()
функцію бібліотеки GNU C або UDP-сокети, а просто випльовують свої дані журналу до стандартної помилки в звичайна мода Unix.
управління журналом з noh та сімейством daemontools взагалі
З набором інструментів daemontools існує велика гнучкість в журналі. Але в цілому по всій родині ідея полягає в тому, що кожен "головний" dæmon має пов'язаний dæmon "реєстрації". "main" dæmons працює так само, як і не-dæmon-процеси, і записує свої журнальні повідомлення на стандартну помилку (або стандартний вихід), яку підсистема управління послугами вважає підключеною через трубу (яку він тримає відкритою, щоб дані журналу не втрачалися за перезапуск служби) до стандартного вводу dæmon "ведення журналу".
Усі dæmons "ведення журналів" запускають програму, яка десь реєструється . Зазвичай ця програма є чимось подібним multilog
або тим, cyclog
що читається зі свого стандартного вводу та записує (наносекундне часове позначення) файли журналів у суворо обмежений розмір, автоматично обертається, ексклюзивно записується, в каталог. Взагалі, ці dæmons також працюють під егідами окремих спеціалізованих непривілейованих облікових записів користувачів.
Таким чином, в кінцевому підсумку складається система, що має велику кількість розподілених журналів, і дані журналу кожної служби обробляються окремо.
Один може запустити що - щось подібне klogd
або syslogd
або rsyslogd
під керівництвом служби Daemontools сім'ї. Але світ daemontools зрозумів багато років тому, що структура управління сервісом з "реєстрацією" dæmons піддається досить акуратно робити справи простішим способом. Немає необхідності розміщувати всі потоки журналів в одному гігантському міш-месі, розбирати дані журналу, а потім вентилювати потоки назад, щоб розділити файли журналів; а потім (у деяких випадках) закрутити ненадійний механізм повороту зовнішньої колоди збоку. Структура сім'ї daemontools як частина його стандартного управління журналом вже виконує обертання журналу, запис журналу та розділення потоку.
Крім того: модель завантаження ланцюга скасування привілеїв із інструментами, що є загальними для всіх служб, означає, що в програмах реєстрації даних немає необхідності в привілеях суперпользователя; а модель UCSPI означає, що їм потрібно дбати лише про відмінності, такі як транспортування потоку проти дейтаграми.
Набір інструментів "ніш" - це приклад. Хоча ви можете запускатись rsyslogd
під ним, поза коробкою та просто керувати /run/log
введенням ядра , та журналу UDP по-старому; він також пропонує більше "рідних демонів" способів реєстрації цих речей:
klogd
служба , яка читає /proc/kmsg
і пише просто , що потік журналу в стандартній помилки. Це робиться за допомогою простої програми з назвою klog-read
. Асоційований dæmon журналу подає потік журналу на його стандартному вході в /var/log/sv/klogd
каталог журналів.
local-syslog-read
служба , яка читає датаграми /dev/log
( /run/log
на BSDs) і просто пише , що потік журналу в стандартній помилки. Це робиться програмою з назвою syslog-read
. Асоційований dæmon журналу подає потік журналу на його стандартному вході в /var/log/sv/local-syslog-read
каталог журналів.
udp-syslog-read
сервіс , який прослуховує порт UDP системного журналу, читає те , що він відправляється до нього і просто записує потік , що лог його стандартної помилки. Знову ж таки програма syslog-read
. Асоційований dæmon журналу подає потік журналу на його стандартному вході в /var/log/sv/udp-syslog-read
каталог журналів.
- (на BSD)
local-priv-syslog-read
сервіс, який читає дейтаграми з /run/logpriv
та просто записує цей потік журналу до його стандартної помилки. Знову ж таки програма syslog-read
. Асоційований dæmon журналу подає потік журналу на його стандартному вході в /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
socket потоку at /run/systemd/journal/stdout
для даних журналу, що надходять із систем, керованих системою.
- Він прослуховує
AF_LOCAL
сокет дейтаграми at /run/systemd/journal/socket
для даних журналу, що надходять від програм, які говорять про специфічний для системи протокол журналу (наприклад, sd_journal_sendv()
та ін.).
- Це змішує все це разом.
- Він записує до набору файлів журналу на загальносистемному рівні та для кожного користувача, у
/run/log/journal/
або /var/log/journal/
.
- Якщо він може підключитися (як клієнт) до
AF_LOCAL
сокета дейтаграми, /run/systemd/journal/syslog
він записує туди дані журналу, якщо налаштовано пересилання в syslog.
- Якщо налаштовано, він записує дані журналу в буфер ядра за допомогою
/dev/kmsg
механізму, що записується .
- Якщо налаштовано, він записує дані журналу в термінали та на консольний пристрій.
Погані речі трапляються в усьому світі, якщо ця програма виходить з ладу або служба припиняється.
systemd сам організовує приєднання до /run/systemd/journal/stdout
сокета стандартних виходів та помилок (деяких) служб . Таким чином, dæmons, які входять до стандартної помилки у звичайному вигляді, надсилають їх до журналу.
Це повністю витісняє klogd, syslogd, syslog-ng та rsyslogd.
Тепер вони повинні бути специфічними для системи. У системній системі вони не можуть бути сервером /dev/log
. Натомість вони використовують один із двох підходів:
- Вони стають серверним кінцем
/run/systemd/journal/syslog
, до якого (якщо ви пам’ятаєте) systemd-journald
намагаються підключити та записати дані журналу. Пару років тому, хтось налаштував би imuxsock
метод введення rsyslogd для цього.
- Вони читають безпосередньо з системного журналу, використовуючи специфічну для системи бібліотеку, яка розуміє формат бінарних журналів і може контролювати файли журналу та каталог для додавання нових записів. Сьогодні для цього можна налаштувати метод
imjournal
введення rsyslogd .