Взаимосвязь rsyslog и journald в Ubuntu 16.04
Я использую ванильный сервер Ubuntu 16.04 и пытаюсь понять, как ведется логирование по умолчанию. Я вижу, что оба journald
а также rsyslog
установлены и работают, но мне не совсем понятно, как обрабатываются сообщения журнала.
Большинство сообщений, кажется, отображаются как в /var/log/syslog
и через journalctl
, но я не вижу никакой явной конфигурации для пересылки между двумя в /etc/systemd/journald.conf
(который в основном все закомментирован по умолчанию), /etc/rsyslog.conf
или же /etc/rsyslog.d/50-default.conf
, Я пытался найти официальную документацию или даже сообщение в блоге, объясняющее, как эти два настроены в Ubuntu, но не смог ничего найти.
Чтобы еще больше добавить к моей путанице, я выполнил logger -p local1.info Test
на хосте, и обнаружил, что ничего не было написано /var/log/syslog
в то время как сообщение появилось под journalctl
,
Мои вопросы:
- Как в действительности работают journald и rsyslog в Ubuntu 16.04 (по умолчанию)?
Как приходят сообщения отlogger
казалось бы, в конечном итоге в журнале, но не в системном журнале?
Обновление: оказывается logger
не работать, как ожидалось, было ошибкой с моей стороны, так что это не имеет отношения к основному вопросу.
2 ответа
По умолчанию rsyslog
использует модуль "imuxsock", модуль обеспечивает:
возможность принимать сообщения системного журнала через локальные сокеты Unix. Самое главное, это механизм, с помощью которого вызов syslog(3) доставляет сообщения syslog в rsyslogd [1].
Это возможно для rsyslog
импортировать сообщения структурированного журнала из systemd-journal, используя модуль с именем "imjournal" [2].
Это можно загрузить как:
module(load="imjournal")
в:
/etc/rsyslog.conf
С другой стороны, "systemd-journald" собирает все данные:
man systemd-journald
systemd-journald - системный сервис, который собирает и хранит данные журналов. Он создает и поддерживает структурированные, проиндексированные журналы на основе информации журнала, полученной из различных источников:
· Kernel log messages, via kmsg · Simple system log messages, via the libc syslog(3) call · Structured system log messages via the native Journal API, see sd_journal_print(4) · Standard output and standard error of system services · Audit records, via the audit subsystem
Вы можете отключить rsyslogd
пока у вас есть доступ к системным журналам с помощью journalctl
,
$ sudo systemctl mask rsyslogd
$ sudo systemctl stop syslog.socket
$ sudo systemctl stop rsyslog.service
$ systemctl is-active rsyslog.service
inactive
$ logger -p mail.info Helllooo
$ journalctl
Например, centos использует модуль "imuxsock" для захвата всех данных "systemd-journald" через rsyslog
пока opensuse вообще не имеет "системного журнала".
Чтобы выяснить, почему ваше сообщение не закончилось /var/log/syslog
, вы должны проверить этот файл:
less /etc/rsyslog.d/50-default.conf
Ищу *.info
Посмотрите, где они будут храниться, это может быть другой файл, например messages
,
Для меня это проявляется в обоих journalctl
а также syslog
,
Systemd - это система инициализации, используемая для запуска служб при загрузке системы. Journald отвечает за создание журналов для служб, запускаемых systemd. Благодаря интеграции journald с systemd, даже самые ранние сообщения процесса загрузки доступны для journald.
Rsyslog - это демон, специально созданный для обработки журналов, не имеющий отношения к journald. Он может принимать логи разными способами и выводить их разными способами. По умолчанию он не включен, поэтому он также принимает сообщения журнала из journald. Для этого вы должны написать в файле /etc/rsyslog.conf,
$ModLoad imjournal # im -> input module
OR
load(type="imjournal")
Теперь он также будет принимать логи fromm journald. Но я предлагаю вам не менять файл /etc/rsyslog.conf.
В конце файла /etc/rsyslog.conf есть строка
$IncludeConfig /etc/rsyslog.d/*.conf
Это означает, что все файлы, имеющие в конце.conf в папке /etc/rsyslog.d/, должны быть включены во время загрузки rsyslog. Итак, все ваши пользовательские конфиги должны быть в этих файлах
Я бы предложил вам создать файл /etc/rsyslog.d/journald.conf и вставить в него приведенный ниже фрагмент.
Ниже приведен фрагмент официальной страницы rsyslog imjournal.
module(load="imjournal" PersistStateInterval="100"
StateFile="/path/to/file") #load imjournal module
module(load="mmjsonparse") #load mmjsonparse module for structured logs
template(name="CEETemplate" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n" ) #template for messages
action(type="mmjsonparse")
action(type="omfile" file="/var/log/ceelog" template="CEETemplate")
Строка 1 - загружает модуль журнала для приема журналов из journald.
2 - загружен модуль mmjsonparse, используемый при разборе логов
3 - Они структурированы в описанный формат в шаблоне
4 - Он анализирует эти журналы, используя модуль mmjsonparse.
5 - Он отправляет эти журналы в файл, а именно / var / log / ceelog в соответствии со структурой, предоставленной в данном шаблоне, используя модуль omfile(файл модуля вывода - файлы в файл).
Внесите изменения в конфигурации в соответствии с вашими потребностями.