Adiciona ano às entradas geradas pelo rsyslogd

5

A configuração padrão de rsyslogd escreve entradas de registro no formato tradicional, que se parece com isto:

Nov 30 10:40:01 localhost CRON[30786]: pam_unix(cron:session): session closed for user list

Não há ano, o que é inconveniente para ferramentas que processam registros e exigem um registro de data e hora exato para cada entrada, e precisam implementar hacks que adivinhem o ano.

Podemos alternar o rsyslogd para um modelo interno chamado RSYSLOG_FileFormat , que é alterado para um registro de data e hora de alta precisão. Embora este seja o formato de timestamp RFC é bom para o processamento, é verborragia sem espaços em branco que é difícil para os olhos humanos.

2013-11-30T10:50:01.478204-08:00 localhost CRON[31200]: ...

Infelizmente, o sistema de templates do rsyslogd é muito hostil e a documentação é ruim. Inacreditavelmente, apesar de toda a complexidade desnecessária neste sistema de templates, o valor de dateformat está evidentemente ligado a um C enum de escolhas difíceis!

Existem parâmetros como $YEAR , mas eles apenas extraem o horário atual, não o do timestamp da mensagem, de modo que é um hack.

Eu só quero me concentrar em escrever o programa que processa as entradas.

Qual é o resumo certo que posso colocar em um arquivo rsyslogd.conf para obter essa saída exata:

Nov 30 2013 10:40:01 localhost CRON[31200]: ...

Apenas o modelo tradicional, mais o ano.

    
por Kaz 30.11.2013 / 20:22

5 respostas

8

Bem, eu peguei o rsyslog do seu git, fiz um ramificar da linha mais próxima para o que meu sistema está executando e corrigiu :

2013-11-30 13:39:59 localhost sshd[17331]: Accepted publickey for kaz from 192.1...

O que está acima é agora produzido graças a estas rsyslog.conf lines:

$template CustomFormat,"%timegenerated:::date-strftime(%Y-%m-%d %H:%M:%S)% %HOSTNAME% %syslogtag%%msg%0\n"
$ActionFileDefaultTemplate CustomFormat

O formato dado na questão é apenas %b %d %Y %H:%M:%S .

A novidade é date-strftime(...) , que especifica uma propriedade de data baseada na formatação strftime .

Isso é aplicado ao tempo na mensagem de log (seja tempo recebido ou tempo gerado).

Tendo entrado em contato com esta base de código, agora vou tomar banho e mergulhar na banheira.

Atualização de fevereiro de 2016:

Parece que este tópico surgiu em uma lista de discussão do rsyslogd em 2014, com uma referência para esta questão do Unix Stackexchange (o autor original reclama que date-strftime não está funcionando na versão do rsyslogd que ele está usando. Não está brincando!)

Isso resultou na edição 65 que ignora completamente a existência do meu patch strftime -based e segue com uma abordagem desajeitada com itens de substituição personalizados para o dia da semana, hora, ano e assim por diante. Por exemplo, para obter o ano, você precisa usar %timestamp:::date-year% . Este %timestamp:::xxx verbosity deve ser repetido para cada elemento da data!

Assim, %timestamp:::date-strftime(%Y-%m-%d %H:%M:%S) se transforma em:

%timestamp:::date-year%-%timestamp:::date-month%-%timestamp:::date-day% %timestamp:::date-hour%:%timestamp:::date-minute%:%timestamp:::date-second%

Bom sofrimento!

    
por 30.11.2013 / 23:01
2

Uma pequena resposta tardia, mas você pode cortar o ano do formato de data rfc3339 e conectá-lo entre as duas partes do formato de data rfc3164 da seguinte forma:

$template myTemplate,"%timegenerated:1:6:date-rfc3164% %timegenerated:1:4:date-rfc3339% %timegenerated:8:15:date-rfc3164% %HOSTNAME% %syslogtag%%msg%\n"

*.* /var/log/my.log;myTemplate

Testado no rsyslogd 7.4.4

    
por 06.06.2016 / 15:43
0

No arquivo /etc/rsyslog.conf, comente a linha $ ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat. Comentando isso irá gerar timestamps com o formato RFC 3339, que é um timestamp de alta precisão.

    
por 14.01.2015 / 13:30
-1

Eu tive o mesmo requisito e o que fiz foi:

$template MyCustomFmt,"%$YEAR% %timegenerated% %HOSTNAME% %syslogtag%%msg:::drop-last-lf%\n"
$ActionFileDefaultTemplate MyCustomFmt

Anote o prefixo $YEAR .

    
por 07.07.2015 / 12:06
-1

Isso resolveu meu problema:

$template MyCustomFmt,"%$YEAR% %timegenerated% %HOSTNAME% %syslogtag%%msg:::drop-last-lf%\n"
$ActionFileDefaultTemplate MyCustomFmt

Obrigado @vyom pela solução.

    
por 15.11.2017 / 13:55

Tags