rsyslog7 filtra para hostname se não corresponder a regex

3

Sou extremamente novo no rsyslog (mudei recentemente do syslog-ng) e realmente gosto de ter nomes de arquivos dinâmicos ... Meu trabalho recentemente começou a usar o docker e eles estão enviando muitos campos no syslogtag para um host remoto. Então, em vez de configurar filtros para cada instância, estou tentando criar um filtro dinâmico para analisar os detalhes relevantes e colocá-los em seu próprio diretório log / como / var / log / docker / app name / syslog.log

Eu tenho o 'nome do aplicativo' funcionando quando eles estão fornecendo os delimitadores adequados entre os campos, mas quando eles não estão usando o próprio, o regex está retornando ** NO MATCH ** e está colocando tudo em um ' / var / log / docker / ** NENHUM JOGO ** / syslog.log '. Usar o diretório ** NO MATCH ** não é um problema, mas agrupar cada host remoto em um arquivo é. Existe uma maneira de testar se o regex não retornou nenhuma correspondência e depois alterar o nome do arquivo de 'syslog.log' para '% hostname% .log'?

    
por PuDLeZ 10.11.2016 / 21:17

1 resposta

0

Eu não sou um especialista, mas você pode começar com isso: você precisará repetir seu regexp (não sei como você pode avaliar um modelo para obter a string **NO MATCH** ). Por exemplo, digamos que sua parte "appname" é correspondida pelo regexp [a-z]+: , então você pode escrever

$template nomatch,"/var/log/docker/nomatch/%hostname%.log"
if (not re_match($msg, "[a-z]+:")) then {
   action(type="omfile" dynaFile="nomatch")
   stop
}

O $template descreve seu nome de arquivo desejado, o if tenta encontrar a correspondência e, em seguida, faz o action de gravação no arquivo, sem mais nenhuma manipulação desta mensagem. Os parâmetros action() são descritos aqui no RainerScript.

    
por 11.11.2016 / 20:11