O módulo imjournal fornece a capacidade de importar mensagens de log estruturadas do systemd journal para o syslog.
Observe que este módulo lê o banco de dados do journal, o que é considerado uma operação de desempenho relativamente intenso. Como tal, o desempenho de uma configuração utilizando este módulo pode ser notavelmente mais lento do que ao usar o imuxsock . O journal fornece ao imuxsock uma cópia de todas as mensagens syslog “clássicas”, no entanto, ele não fornece dados estruturados. Somente se esses dados estruturados forem necessários, imjournal deve ser usado. Caso contrário, imjournal pode simplesmente ser substituído por imuxsock, e é altamente recomendável fazê-lo.
O site rsyslog.com verificar a breve apresentação sobre a integração do journal rsyslog para saber mais detalhes dos casos de uso antecipados.
O site ainda posta um aviso alertando:
Algumas versões do systemd journal têm problemas com corrupção do banco de dados, o que leva o journal a retornar os mesmos dados infinitamente em loop. Isso resulta em duplicação massiva de mensagens dentro do rsyslog, provavelmente resultando em uma negação de serviço quando os recursos do sistema se esgotam. Isso pode ser um pouco mitigado usando limitadores de taxa adequados, mas mesmo assim há picos de dados antigos que são repetidos indefinidamente. Por padrão, o ratelimiting é ativado e permite processar 20.000 mensagens em 10 minutos, o que deve ser suficiente para a maioria dos casos de uso. Se insuficiente, use os parâmetros descritos abaixo para ajustar o volume permitido. É altamente recomendável usar este plug-in somente se houver grande necessidade de fazê-lo.
Bom, vamos à lista de parâmetros do módulo imjournal.
PersistStateInterval
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
integer | 10 | no | $imjournalPersistStateInterval |
Esta é uma configuração global. Ele especifica com que frequência o estado(state) do journal deve ser persistido. A persistência acontece após cada número de mensagens. Esta opção é útil para o rsyslog começar a ler a partir da última mensagem de diário lida.
StateFile
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
word | none | no | $imjournalStateFile |
Esta é uma configuração global. Ele especifica onde o arquivo de estado(state) para o estado persistente do journal está localizado. Se um nome de caminho completo for fornecido (começando com “/”), esse caminho será usado. Caso contrário, o nome fornecido é criado dentro do diretório de trabalho.
Ratelimit.Interval
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
integer | 600 | no | $imjournalRatelimitInterval |
Especifica o intervalo em segundos no qual a limitação de taxa deve ser aplicada. Se mais mensagens do que o especificado em ratelimit.burst forem lidas durante esse intervalo, outras mensagens até o final do intervalo serão descartadas. A quantidade de mensagens descartadas é emitida ao final do intervalo (se houver descartes).
Definir esse valor como 0 desativa o ratelimiting.
Observe que não é recomendado desativar o ratelimiting, exceto que você tem certeza de que as entradas do banco de dados do diário nunca serão corrompidas. Sem limitação de taxa, um banco de dados de journal do systemd corrompido pode causar um tipo de negação de serviço. Segundo o site rsyslog.com, eles enfatizam este ponto, pois vários usuários relataram tais problemas com o banco de dados do journal – em junho de 2013 e ocasionalmente também após esse período(até o momento de este escrito em janeiro de 2019).
Ratelimit.Burst
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
integer | 20000 | no | $imjournalRatelimitBurst |
Especifica o número máximo de mensagens que podem ser emitidas dentro do intervalo ratelimit.interval.
IgnorePreviousMessages
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
binary | off | no | $ImjournalIgnorePreviousMessages |
Esta opção especifica se o imjournal deve ignorar as mensagens atualmente no journal e ler apenas as novas mensagens. Esta opção só é utilizada quando não há StateFile para evitar perda de mensagem.
DefaultSeverity
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
severity | 5 | no | $ImjournalDefaultSeverity |
Algumas mensagens vindas do journald não possuem o campo SYSLOG_PRIORITY. Normalmente, essas são as mensagens registradas por meio da API nativa do journald. Esta opção especifica a gravidade padrão para essas mensagens. Pode ser dado como um nome ou um número. O padrão é ‘notice’.
DefaultFacility
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
facility | LOG_USER | no | $ImjournalDefaultFacility |
Algumas mensagens vindas do journald não possuem o campo SYSLOG_FACILITY. Normalmente, essas são as mensagens registradas por meio da API nativa do journald. Esta opção especifica o recurso padrão para essas mensagens. Pode ser dado como um nome ou um número. O padrão é ‘user’.
UsePidFromSystem
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
binary | 0 | no | none |
Recupera o parâmetro systemd confiável, _PID, em vez do parâmetro systemd do usuário, SYSLOG_PID, que é o padrão. Esta opção substitui a opção “usepid”. Isso agora está obsoleto. É melhor usar usepid=”syslog”.
UsePid
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
string | both | no | none |
Define a fonte PID do journal
- syslog: imjournal recupera SYSLOG_PID do journal como número PID.
- system: imjournal recupera _PID do diário como número PID.
- both: imjournal tentando recuperar SYSLOG_PID primeiro. Quando não está disponível, também está tentando recuperar _PID. Quando nenhum deles estiver disponível, a mensagem é analisada sem o número PID.
IgnoreNonValidStatefile
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
binary | on | no | none |
Quando um arquivo de estado(state) corrompido é lido, o imjournal ignora o arquivo de estado e continua com o registro desde o início do journal (desde o final, se IgnorePreviousMessages estiver ativado). Depois de PersistStateInterval ou quando o rsyslog é interrompido, o arquivo de estado inválido é substituído por um novo cursor válido.
WorkAroundJournalBug
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
binary | on | no | none |
Descontinuada. Esta opção foi concebida como temporária e não tem efeito agora (desde 8.1910.0). Deixado apenas para compatibilidade com versões anteriores.
FSync
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
binary | off | no | none |
Quando há uma falha grave, perda de energia ou fim abrupto semelhante do processo rsyslog, existe o risco de o arquivo de estado(state) não ser gravado no armazenamento persistente ou possivelmente corrompido. Isso resulta na leitura inicial do diário em outro lugar do que o desejado e, provavelmente, na duplicação da mensagem. Para atenuar esse problema, você pode ativar essa opção que forçará as gravações do arquivo de estado(state) no armazenamento físico persistente. Observe que as chamadas fsync são caras, portanto, especialmente com valor de PersistStateInterval mais baixo, isso pode apresentar um impacto considerável no desempenho.
Remote
type | default | mandatory | obsolete legacy directive |
---|---|---|---|
binary | off | no | none |
Quando esta opção estiver ativada, o imjournal extrairá não apenas todos os arquivos de journal locais (comportamento padrão), mas também quaisquer arquivos de diário na máquina originários de fontes remotas.
Contador Estatístico
Este plug-in mantém estatísticas para cada ouvinte(listener) e para cada thread de trabalho. A estatística do ouvinte(listener) é denominada “imjournal”.
As seguintes propriedades são mantidas para cada ouvinte:
- read – número total de mensagens lidas do journal desde a inicialização.
- submitted – número total de mensagens enviadas à fila principal após a leitura do journal para processamento desde a inicialização. Todos os registros podem não ser enviados devido à limitação de taxa.
- descarded – número total de mensagens que foram lidas, mas não enviadas para a fila principal devido à limitação de taxa.
- failed – número total de falhas para ler mensagens do journal.
- poll_failed – número total de falhas de votação do journal.
- rotations– número total de rotações do arquivo de journal.
- recovery_attempts – número total de tentativas de recuperação por imjournal após erros desconhecidos ao fechar e reabrir o journal.
- ratelimit_discarded_in_interval – número de mensagens descartadas devido à limitação de taxa dentro do intervalo de limitação de taxa configurado.
- disk_usage_bytes – tamanho total do journal obtido de sd_journal_get_usage().
Aqui está um exemplo de saída da mensagem imjournal impstat correspondente, que é produzida carregando imjournal com intervalo de limite de taxa padrão e estourando e executando um contêiner docker com log-driver como journald que emite muitos logs para stdout:
Jun 13 15:02:48 app1-1.example.com rsyslogd-pstats: imjournal: origin=imjournal submitted=20000 read=216557 discarded=196557 failed=0 poll_failed=0 rotations=6 recovery_attempts=0 ratelimit_discarded_in_interval=196557 disk_usage_bytes=106610688
Embora esses contadores forneçam informações sobre envios de mensagens de fim de journal para a fila principal, bem como perdas devido à limitação de taxa ou outros problemas para extrair mensagens do journal, eles não oferecem visibilidade total dos problemas de fim de journal. Embora esses contadores meçam as rotações do diário e o uso do disco, eles não oferecem visibilidade da perda de mensagens devido à limitação da taxa do journal. A API sd_journal_* não fornece nenhuma visibilidade nas mensagens que são descartadas pelo diário devido à limitação de taxa. O Journald emite uma mensagem syslog quando as mensagens de log não podem entrar no diário devido à limitação de taxa:
Jun 13 15:50:32 app1-1.example.com systemd-journal[333]: Suppressed 102 messages from /system.slice/docker.service
Essas mensagens podem ser processadas após serem lidas no imjournal para obter um sinal de perda de mensagem devido à limitação da taxa de fim do diário usando um contador de estatísticas dinâmicas para essas linhas de log com uma regra como esta:
dyn_stats(name="journal" resettable="off") if $programname == 'journal' and $msg contains 'Suppressed' and $msg contains 'messages from' then { set $.inc = dyn_inc("journal", "suppressed_count"); }
Exemplos
O exemplo a seguir mostra como extrair mensagens estruturadas de imjournal e salvá-las em /var/log/ceelog.
module(load="imjournal" PersistStateInterval="100" StateFile="/path/to/file") #load imjournal module module(load="mmjsonparse") #load mmjsonparse module for structured logs template(name="CEETemplate" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n" ) #template for messages action(type="mmjsonparse") action(type="omfile" file="/var/log/ceelog" template="CEETemplate")
Fonte: rsyslog.com