Recebendo mensagens Syslog com um Arch Linux do systemd

25

Sinto que negligenciei o óbvio, mas não consigo descobrir como obter meu servidor Arch Linux, que usa systemd, para receber e registrar syslogmensagens de um sistema remoto.

Eu tenho um modem Cisco 678 DSL e um DD-WRT WAP, e ambos podem ser configurados para enviar mensagens no formato syslog para outra máquina. Eu gostaria que essa máquina fosse meu servidor Arch Linux.

Pesquisei no Google, e tudo o que encontro é que "systemd substitui o syslog" ou que não preciso mais executar syslogou algo igualmente irrelevante para a minha pergunta.

ATUALIZAR

Eu perguntei nos fóruns do Arch e não obtive respostas relevantes. Instalei o syslog-ng apenas para ouvir na porta UDP 514. O syslog-ng grava mensagens do meu Cisco 678 e um DD-WRT WAP que tenho. Infelizmente, as mensagens não acabam no diário do systemd, mas em arquivos simples. Portanto, não há solução exata, mas uma solução alternativa. Prefiro ter as mensagens syslog no diário, não em arquivos simples.

Bruce Ediger
fonte
O systemd usa seu próprio log . Há também o metalog , disponível nos principais repositórios do Arch - eu, pessoalmente, uso todos os três: syslog, diário do systemd e metalog. Tente verificar o diário systemd. Se bem me lembro, o syslog, desde a mudança para systemd, foi configurado para enviar todas as suas mensagens e assim para o diário do systemd.
Alexej Magura

Respostas:

11

Você pode escrever com facilidade o servidor syslog de um pobre homem com o socat . Você só precisa de uma unidade de serviço como esta:

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

Ele envia cegamente qualquer coisa recebida na porta do serviço syslog para o diário systemd. Salve o acima como, digamos, /etc/systemd/system/syslog.servicee depois

# systemctl daemon-reload
# systemctl start syslog

Você só precisa da sua fonte para enviar mensagens para a porta UDP 514 no seu servidor de escuta.

Você pode melhorar isso para analisar os dados recebidos e formatá-los, mas não é necessário se tudo o que você deseja fazer é registrar o diário no recebimento.

( Socat está no Arch Linux extra repositório: pacman -S socat)

starfry
fonte
4
Boa resposta. Fui com um script python rápida desde que eu não poderia 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

Portanto, há um pouco de diferença aqui.

O Systemd suporta mensagens remotas através do componente systemd-journal-gateway. Dito isto, essas mensagens não estão no formato syslog. Syslog (como um formato) é uma especificação especificada pela IETF, documentada na RFC 5424 (que obsoleta a versão anterior, RFC 3164).

Mais dos meandros de fazer com que essas jogadas sejam bem organizadas estão documentados aqui:

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

e aqui (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.

Em resumo, verifique se as mensagens são enviadas do syslog-ng para o STDOUT e que as coisas devem terminar no diário.

Ao acompanhar isso um pouco mais, também achei isso:

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

Onde alguém está escrevendo uma ligação do PostgreSQL para o systemd para log. Nisso, eles citam que atualmente (no momento desse arquivo, 2013/06) as mensagens de várias linhas não são suportadas no systemd, portanto, observe isso também.

Brian Redbeard
fonte
2

Não conheço a distribuição do Arch. Eu tenho o Fedora 20 (incluindo o systemd) e o configurei para aceitar mensagens remotas do syslog.

IMHO, essa funcionalidade não está relacionada ao systemd. O systemd-journald.service se interpõe entre os programas kernel / userspace e o subsistema syslog. Ele captura (eu acho) apenas as mensagens locais dessas fontes no banco de dados do diário e as encaminha para o syslog. Veja por exemplo "man systemd-journald.service" (pelo menos no Fedora).

No meu caso, eu habilito isso configurando um "módulo receptor TCP syslog" opcional em /etc/rsyslog.conf

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Um módulo UDP também está disponível.

Também é necessário adicionar regras (r) syslog para direcionar a saída para os arquivos desejados. Para documentação completa, consulte: http://www.rsyslog.com/doc/

HTH.

Robb W.
fonte
2

Instalei o syslog-ng e consegui receber mensagens de log do syslog. Mas o que eu realmente queria era receber mensagens de log do syslog e depois gravar a mensagem no diário. Não foi possível encontrar uma maneira de configurar o syslog-ng para gravar mensagens syslog remotas no diário.

Então, eu escrevi um utilitário para fazer isso.

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

Arquivos de construção e instruções para teste e amostra de arquivos da unidade systemd estão incluídos no projeto. Apreciar!

RickHigh
fonte
0

diário syslog-ng e systemd

Do syslog-ng

Começando com o syslog-ng versão 3.6.1, a system()fonte padrão nos sistemas Linux que usam systemd usa journald como sua system()fonte padrão .

Se você deseja usar os arquivos journald e syslog-ng, verifique se as seguintes configurações estão em vigor. Para systemd-journald, no arquivo /etc/systemd/journald.conf, Storage = definido como automático ou não definido (o padrão é auto) e ForwardToSyslog = definido como não ou não definido (o padrão é não). Para /etc/syslog-ng/syslog-ng.conf, você precisa da seguinte estrofe de origem:

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

Se, por outro lado, você desejar não reter os logs do diário, mas apenas os logs de texto do syslog-ng, defina Storage=volatilee ForwardToSyslog=yesentre /etc/systemd/journald.conf. Isso armazenará o diário em memória ram. A partir do syslog-ng 3.6.3, o syslog-ng está usando o journald como a system()fonte; portanto, se você definir Storage = none, o journal do systemd eliminará todas as mensagens e não as encaminhará para o syslog-ng.

Após a alteração, reinicie os daemons systemd-journald.servicee syslog-ng.service.

RickHigh
fonte