Взаимосвязь 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,

Мои вопросы:

  1. Как в действительности работают journald и rsyslog в Ubuntu 16.04 (по умолчанию)?
  2. Как приходят сообщения от 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(файл модуля вывода - файлы в файл).

Внесите изменения в конфигурации в соответствии с вашими потребностями.

Другие вопросы по тегам