journald - reenviar os logs arquivados para o registro em log do soquete

1

Eu tenho um dispositivo incorporado que tem systemd e rsyslog . journald é o principal mecanismo para registro local e rsyslog para registro remoto. O rsyslog nem sempre está em execução e é iniciado apenas quando a depuração é necessária.

Quando o rsyslog é iniciado, ele encaminha apenas os eventos que acontecem a partir desse momento. Estou tentando fazer com que ele encaminhe todos os logs que estão disponíveis no journald no momento.

A maneira correta de fazer isso seria ativar $ModLoad imjournal em /etc/rsyslog.conf . Isso permitiria ao rsyslog ler os arquivos arquivados do journald.

Eu estou em um sistema embarcado que não tem módulo imjournal disponível para o rsyslog e estou procurando uma solução alternativa.

Uma solução alternativa seria fazer o journald reenviar todos os logs arquivados de antes para o soquete (agora ativo) que o rsyslog está escutando.

Existe uma maneira de fazer isso?

    
por TheMeaningfulEngineer 07.11.2018 / 14:03

1 resposta

1

Esse recurso não está realmente disponível no journald.

A página man journald.conf documenta essa limitação de ForwardToSyslog= :

If forwarding to syslog is enabled but nothing reads messages from the socket, forwarding to syslog has no effect.

É por isso que as mensagens de inicialização antecipada são perdidas. A página man também declara:

With [imjournal], messages do not have to be read immediately, which allows a logging daemon which is only started late in boot to access all messages since the start of the system.

Por isso, é recomendável usar esse método.

Eu acho que um "kludge" pode ser feito quando o rsyslog é iniciado, alimentando as mensagens armazenadas no diário desde a inicialização, usando journalctl para lê-las e logger para alimentá-las no rsyslog. Talvez algo tão simples como isso possa funcionar:

journalctl -b | logger -u /run/systemd/journal/syslog

Embora seja possível logger tentará adicionar datas e tags às mensagens, e o efeito final poderá parecer diferente das mensagens encaminhadas ... Talvez você precise de algo mais cru ou de nível inferior a logger ou talvez reformatar journalctl saída para que esteja em um formato que o rsyslog entenderá ...

Esta solução tem uma condição de corrida, pois é bem possível que algumas mensagens sejam perdidas (ou duplicadas) entre esse feed inicial e o encaminhamento do journald.

Começar o trabalho do iJournal é definitivamente uma solução melhor. Estou curioso para saber por que ele não pode ser disponibilizado, afinal, tanto o software systemd quanto o rsyslog foram compilados e construídos para o seu dispositivo, então seria tecnicamente possível construir o modo imjournal também ... Talvez haja alguma compilação cruzada envolvida, que pode representar dificuldades de vinculação a bibliotecas do systemd, mas tenho certeza de que é um problema solucionável, então, talvez considere fazer uma pergunta para conseguir esse trabalho em seu lugar.

Outra solução possível a considerar é usar os protocolos remotos do diário nativo (em vez do protocolo e daemon syslog) para centralizar seus logs.

systemd-journal-remote que você pode executar modo "afundar" em um host remoto para receber entradas de seu dispositivo incorporado, para salvá-las localmente. E systemd-journal-upload , que você pode executar no seu arquivo incorporado dispositivo para enviar dados do diário para o host remoto.

Isso deve preservar as mensagens de inicialização antecipada e também manter todos os metadados, já que as mensagens não precisam ser convertidas para o formato syslog. Também tem a vantagem de não precisar manter um daemon rsyslog em execução localmente no dispositivo incorporado.

(A revista também suporta um modelo "pull", em que você executa systemd -journal-gatewayd no seu dispositivo incorporado e configure o systemd-journal-remote para extraí-lo.)

    
por 07.11.2018 / 15:12