Recibir mensajes de Syslog con un systemd Arch Linux

25

Siento que he pasado por alto lo obvio, pero no puedo entender cómo obtener mi servidor Arch Linux, que usa systemd, para recibir y registrar syslogmensajes desde un sistema remoto.

Tengo un módem DSL Cisco 678 y un WAP DD-WRT, y ambos se pueden configurar para enviar mensajes en formato syslog a otra máquina. Me gustaría que esa máquina sea mi servidor Arch Linux.

He buscado en Google, y todo lo que encuentro es que "systemd reemplaza syslog", o que ya no necesito ejecutar syslogo algo igualmente irrelevante para mi pregunta.

ACTUALIZAR

He preguntado en los foros de Arch y no obtuve respuestas relevantes. He instalado syslog-ng solo para escuchar en el puerto UDP 514. syslog-ng escribe mensajes de mi Cisco 678 y tengo un DD-WRT WAP. Desafortunadamente, los mensajes no terminan en el diario de systemd, sino en archivos planos. Por lo tanto, no hay una solución exacta, sino una solución alternativa. Prefiero tener los mensajes de syslog en el diario, no en archivos planos.

Bruce Ediger
fuente
systemd usa su propio registro . También hay un metalog , que está disponible en los repositorios principales de Arch. Yo, personalmente, uso los tres: syslog, journal de systemd y metalog. Intente verificar el diario systemd. Si recuerdo correctamente, syslog, desde el cambio a systemd, se ha configurado para enviar todos sus mensajes y similares al diario de systemd.
Alexej Magura

Respuestas:

11

Puede escribir el servidor syslog de un pobre con bastante facilidad con socat . Solo necesita una unidad de servicio como esta:

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

Enviará ciegamente todo lo recibido en el puerto del servicio syslog al diario systemd. Guarde lo anterior como, digamos, /etc/systemd/system/syslog.servicey luego

# systemctl daemon-reload
# systemctl start syslog

Entonces solo necesita su fuente para enviar mensajes al puerto UDP 514 en su servidor de escucha.

Es posible que desee mejorar esto para analizar los datos recibidos y formatearlos, pero no es necesario si todo lo que desea hacer es registrar lo que se recibe.

( Socat está en el Arch Linux extra repositorio: pacman -S socat)

starfry
fuente
44
Buena respuesta. Fui con un script de python rápido ya que no pude instalar 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

Entonces hay un poco de brecha aquí.

Systemd admite la mensajería remota a través del componente systemd-journal-gateway. Dicho esto, estos mensajes no están en formato syslog. Syslog (como formato) es una especificación ratificada por IETF documentada en RFC 5424 (que desaprobó la versión anterior, RFC 3164).

Aquí se documentan más de las complejidades de hacer que estos jueguen bien juntos:

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

y aquí (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.

En resumen, asegúrese de que los mensajes se envíen desde syslog-ng a STDOUT y que todo termine en el diario.

En el seguimiento de esto un poco más, encontré esto también:

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

Donde alguien está escribiendo un enlace desde PostgreSQL a systemd para iniciar sesión. En esto citan que actualmente (a partir de la fecha de ese archivo, 2013/06) los mensajes multilínea no son compatibles con systemd, así que ten cuidado con eso también.

Brian Barba Roja
fuente
2

No sé la distribución del arco. Tengo Fedora 20 (incluido systemd) y lo configuré para aceptar mensajes remotos de syslog.

En mi humilde opinión, esta funcionalidad no está relacionada con systemd. Systemd-journald.service se interpone entre los programas kernel / userspace y el subsistema syslog. Captura (creo) solo los mensajes locales de estas fuentes en su base de datos de diarios y luego los reenvía a syslog. Ver por ejemplo "man systemd-journald.service" (al menos en Fedora).

En mi caso, habilito esto configurando un "módulo receptor TCP syslog" opcional en /etc/rsyslog.conf

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Un módulo UDP también está disponible.

También es necesario agregar (r) reglas de syslog para dirigir la salida a los archivos deseados. Para ver la documentación completa, consulte: http://www.rsyslog.com/doc/

HTH.

Robb W.
fuente
2

Instalé syslog-ng y pude recibir mensajes de registro de syslog. Pero lo que realmente quería era recibir mensajes de registro de syslog y luego escribir dicho mensaje en journald. No pude encontrar una manera de configurar syslog-ng para escribir mensajes remotos de syslog en journald.

Entonces escribí una utilidad para hacer esto.

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.)

Los archivos de compilación y las instrucciones para la prueba y los archivos de muestra de la unidad systemd se incluyen con el proyecto. ¡Disfrutar!

RickHigh
fuente
0

syslog-ng y systemd journal

De syslog-ng

Comenzando con syslog-ng versión 3.6.1, la system()fuente predeterminada en los sistemas Linux que usan systemd usa journald como su system()fuente estándar .

Si desea utilizar los archivos journald y syslog-ng, asegúrese de que las siguientes configuraciones estén vigentes. Para systemd-journald, en el archivo /etc/systemd/journald.conf, Storage = configurado en auto o unset (que por defecto es auto) y ForwardToSyslog = set en no o unset (por defecto en no). Para /etc/syslog-ng/syslog-ng.conf, necesita la siguiente sección fuente:

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

Si, por otro lado, no desea retener los registros del diario, sino solo los registros de texto de syslog-ng, configurados Storage=volatiley ForwardToSyslog=yesen /etc/systemd/journald.conf. Esto almacenará journald en ram. A partir de syslog-ng 3.6.3, syslog-ng está utilizando journald como system()fuente, por lo que si establece Storage = none, el diario systemd descartará todos los mensajes y no los reenviará a syslog-ng.

Después del cambio, reinicie los demonios systemd-journald.servicey syslog-ng.service.

RickHigh
fuente