Получение сообщений системного журнала с помощью systemd Arch Linux

25

Мне кажется, что я упустил очевидное, но я не могу понять, как получить мой сервер Arch Linux, который использует systemdдля получения и регистрации syslogсообщений из удаленной системы.

У меня есть DSL-модем Cisco 678 и WAP DD-WRT, и оба они могут быть настроены для отправки сообщений в формате системного журнала на другой компьютер. Я бы хотел, чтобы эта машина была моим сервером Arch Linux.

Я погуглил, и все, что я нахожу, это то, что «systemd заменяет системный журнал», или что мне больше не нужно запускать syslogили что-то такое же не относящееся к моему вопросу.

ОБНОВИТЬ

Я спрашивал на форумах Arch и не получил соответствующих ответов. Я установил syslog-ng только для прослушивания UDP-порта 514. syslog-ng записывает сообщения от моего Cisco 678, и у меня есть DD-WRT WAP. К сожалению, сообщения попадают не в журнал systemd, а в виде простых файлов. Таким образом, нет точного решения, но что-то вроде обходного пути. Я предпочел бы иметь сообщения системного журнала в журнале, а не в плоских файлах.

Брюс Эдигер
источник
systemd использует свой собственный журнал . Также есть metalog , который доступен в основных репозиториях Arch - лично я использую все три: syslog, журнал systemd и metalog. Попробуйте проверить журнал systemd. Если я правильно помню, syslog, с момента перехода на systemd, был настроен на отправку всех своих сообщений и тому подобного в журнал systemd.
Алексей Магура

Ответы:

11

Вы можете написать сервер системного журнала для бедного человека с помощью socat . Вам просто нужен сервисный блок, как это:

[Service]
Restart=on-success
ExecStart=/usr/bin/socat -u UDP-RECV:514 STDOUT

Он будет вслепую отправлять все, что получено через сервисный порт системного журнала, в системный журнал. Сохраните выше, как, скажем, /etc/systemd/system/syslog.serviceа затем

# systemctl daemon-reload
# systemctl start syslog

Затем вам просто нужен источник для отправки сообщений на UDP-порт 514 на вашем слушающем сервере.

Возможно, вы захотите улучшить это, чтобы фактически проанализировать полученные данные и отформатировать их, но это не обязательно, если все, что вы хотите сделать, это записать в журнал то, что было получено.

( Сокат находится в Arch Linux Дополнительные репозитории: pacman -S socat)

starfry
источник
4
Хороший ответ. Я пошел с быстрым скриптом Python, так как я не мог установить socat:import socket; sock = socket.socket(type=socket.SocketKind.SOCK_DGRAM); sock.bind(("0.0.0.0", 514)); while True: print(sock.recv(1024 * 1024))
awelkie
3

Так что здесь есть небольшой разрыв.

Systemd поддерживает удаленный обмен сообщениями через компонент systemd-journal-gateway. При этом эти сообщения не в формате системного журнала. Системный журнал (как формат) - это спецификация, утвержденная IETF, документированная в RFC 5424 (которая устарела в предыдущей версии, RFC 3164).

Другие тонкости создания этих игр хорошо описаны здесь:

http://www.freedesktop.org/wiki/Software/systemd/syslog/

и здесь (man systemd-journald.service)

   systemd-journald is a system service that collects and stores logging data.
   It creates and maintains structured, indexed journals based on logging
   information that is received from the kernel, from user processes via the
   libc syslog(3) call, from STDOUT/STDERR of system services or via its native
   API. It will implicitly collect numerous meta data fields for each log
   messages in a secure and unfakeable way. See systemd.journal-fields(7) for
   more information about the collected meta data.

В итоге убедитесь, что сообщения отправляются из syslog-ng в STDOUT и все должно заканчиваться в журнале.

В продолжение этого я обнаружил и следующее:

https://github.com/intgr/pg_journal/blob/master/doc/pg_journal.md

Где кто-то пишет привязку из PostgreSQL к systemd для регистрации. В этом они ссылаются на то, что в настоящее время (на момент создания этого файла, 2013/06) многострочные сообщения не поддерживаются в systemd, так что следите за этим.

Брайан Редберд
источник
2

Я не знаю распределение Arch. У меня есть Fedora 20 (включая systemd), и я настроил ее на прием удаленных сообщений системного журнала.

ИМХО, этот функционал не относится к systemd. Systemd-journald.service располагается между программами ядра / пространства пользователя и подсистемой системного журнала. Он записывает (я думаю) только локальные сообщения из этих источников в свою базу данных журнала, а затем перенаправляет их в системный журнал. Смотрите, например, "man systemd-journald.service" (по крайней мере, в Fedora).

В моем случае я включаю это, настраивая дополнительный «модуль приемника системного журнала TCP» в /etc/rsyslog.conf, т.е.

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Также доступен модуль UDP.

Также необходимо добавить (r) правила системного журнала, чтобы направить вывод в нужные файлы. Для полной документации см .: http://www.rsyslog.com/doc/

НТН.

Робб В.
источник
2

Я установил syslog-ng и смог получать сообщения журнала syslog. Но я действительно хотел получить сообщения журнала системного журнала, а затем написать указанное сообщение в журнал. Я не смог найти способ настроить syslog-ng для записи удаленных сообщений syslog в journald.

Поэтому я написал утилиту для этого.

https://github.com/advantageous/rsyslog-journald-repeater

./rsyslog-journald-repeater -h
Usage of ./rsyslog-journald-repeater:
-debug
    debug flag
-host string
    hostname to listen on (default "0.0.0.0")
-port int
    port to listen on (default 5514 on darwin, default 514 on Linux, Unix, etc.)

Файлы сборки и инструкции по тестированию, а также примеры файлов системных модулей включены в проект. Наслаждайтесь!

RickHigh
источник
0

системный журнал и системный журнал

Из системного журнала

Начиная с syslog-ng версии 3.6.1 system()исходный код по умолчанию в системах Linux, использующих systemd, использует journald в качестве стандартного system()источника.

Если вы хотите использовать файлы journald и syslog-ng, убедитесь, что действуют следующие настройки. Для systemd-journald в файле /etc/systemd/journald.conf для Storage = установлено либо auto, либо unset (по умолчанию auto), а для ForwardToSyslog = значение no или unset (по умолчанию no). Для /etc/syslog-ng/syslog-ng.conf вам потребуется следующий раздел исходного кода:

 source src {
   system();
   internal();
 };

Если, с другой стороны, вы хотите не сохранять журналы journald, а только текстовые журналы syslog-ng, set Storage=volatileи ForwardToSyslog=yesin /etc/systemd/journald.conf. Это будет хранить журнал в оперативной памяти. Начиная с syslog-ng 3.6.3, syslog-ng использует journald в качестве system()источника, поэтому, если вы установите Storage = none, журнал systemd удалит все сообщения и не перенаправит их в syslog-ng.

После изменения перезапустите systemd-journald.serviceи syslog-ng.serviceдемонов.

RickHigh
источник