Preciso executar várias ações para algumas mensagens de log. Por exemplo, quero registrá-los em arquivos diferentes de acordo com a gravidade.
Está tudo bem se eu usar isso:
if $programname == 'myprog' then -/var/log/myprog.log
if $programname == 'myprog' and $syslogseverity-text >= 'warning' then -/var/log/myprog-alert.log
if $programname == 'myprog' ~
Este log todas as mensagens emitidas por 'myprog' para /var/log/myprog.log
Este log apenas aviso e mensagem de erro emitida por 'myprog' para -/var/log/myprog-alert.log
E o processamento é então interrompido (obrigado para '~')
.
Eu gosto de ter algo mais sexy:
if $programname == 'myprog' then {
*.* -/var/log/myprog.log
*.warning -/var/log/myprog-alert.log
~
}
Mas essa construção posterior, embora aceita pelo rsyslog, não é filtrada pelo nome do programa.
Por exemplo, todas as mensagens são gravadas em /var/log/myprog.log, mesmo quando originadas de qualquer processo.
.
Alguém pode explicar onde está o meu erro ou mal-entendido?
.
Método final, das respostas abaixo:
use um rsyslogd "moderno". Versão > 7.xy
use esta sintaxe:
if $programname == 'myprog' then {
*.warning -/var/log/myprog-alert.log
*.* -/var/log/myprog.log
*.* stop
}
ou este:
if $programname == 'myprog' then {
*.warning -/var/log/myprog-alert.log
-/var/log/myprog.log
stop
}
De acordo com os documentos do rsyslog para filtros e RanierScript , a sintaxe { .. } de várias linhas não é suportada. O analisador do Rsyslog geralmente não apresenta erros, preferindo apenas ignorar os problemas ou interpretá-los de uma maneira que você não pretendia. Seu exemplo "mais sexy" provavelmente está executando a
{
ação para eventos correspondentes a "myprog" (e não consigo encontrar tal ação, então suspeito que isso signifique "não fazer nada"). A segunda e a terceira linhas estão sendo tratadas como configuração de syslog de estilo legado, e a quarta e a quinta são inválidas (então, novamente, provavelmente "não faça nada")Sua linha contendo apenas '~' está errada. Deve ser "*.* ~".
Eu sei que você usa principalmente o Debian estável. Sua versão do rsyslog é 5.xy e não aceita RanierScript.
Você pode atualizar para a versão backports (7.6.3 atualmente), então seu segundo exemplo deve funcionar.