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.
Uma vez que o rsyslog é iniciado, ele encaminha apenas os eventos que acontecem a partir desse ponto no tempo. 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 habilitar $ModLoad imjournal
no /etc/rsyslog.conf
. Isso permitiria ao rsyslog ler os arquivos arquivados do journald.
Estou em um sistema embarcado que não possui o módulo imjournal disponível para rsyslog e estou procurando uma solução alternativa.
Uma solução alternativa seria ter journald reenviar todos os logs arquivados de antes para o soquete (agora ativo) que o rsyslog está ouvindo.
Existe uma maneira de fazer isso?
Esse recurso não está realmente disponível no journald.
A página man journald.conf documenta esta limitação de
ForwardToSyslog=
:É por isso que as mensagens da inicialização antecipada são perdidas. A página man também afirma:
É por isso que o uso de tal método é recomendado.
Eu acho que um "kludge" poderia ser feito quando o rsyslog é iniciado pela primeira vez, alimentando-o com mensagens armazenadas no diário desde a inicialização, usando
journalctl
para lê-las elogger
alimentá-las para o rsyslog. Talvez algo tão simples como isso possa funcionar:Embora seja possível
logger
tentar adicionar datas e tags às mensagens e o efeito final pode parecer diferente das mensagens encaminhadas ... Talvez você precise de algo mais bruto ou de baixo nível do quelogger
, ou talvez reformatejournalctl
a saída para que fique em um formato rsyslog vai 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.
Obtendo o trabalho imjournal é 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 pelo menos tecnicamente possível construir o modo ijournal também ... alguma compilação cruzada envolvida, o que pode representar desafios para vincular a bibliotecas do systemd, mas tenho certeza de que é um problema solucionável, então talvez considere fazer uma pergunta para fazer isso funcionar.
Outra solução possível a ser considerada é usar os protocolos remotos de diário nativo (em vez do protocolo syslog e daemon) para centralizar seus logs.
Existe o systemd-journal-remote que você pode executar no modo "sink" em um host remoto para receber entradas do seu dispositivo incorporado, para salvá-las localmente. E systemd-journal-upload , que você pode executar em seu dispositivo incorporado para enviar dados do diário para o host remoto.
Isso deve preservar as mensagens da inicialização antecipada e também manter todos os metadados, pois as mensagens não precisam ser convertidas para o formato syslog. Ele também tem a vantagem de não precisar manter um daemon rsyslog executando localmente em seu dispositivo incorporado.
(O diário também suporta um modelo "pull", no qual você executa o systemd-journal-gatewayd em seu dispositivo incorporado e configura o systemd-journal-remote para extrair dele.)