Como definir e usar constantes no rsyslog (RainerScript)?

1

Estou escrevendo um aplicativo que inclui uma configuração de rsyslog que é colocada em /etc/rsyslog.d/ .

Certas mensagens de log devem ser redirecionadas para um pipe nomeado, da seguinte forma:

template (name="my_fmt" type="string" string="<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag% %msg%\n")
if ( ... ) then {
    action(type="ompipe" Pipe="/tmp/SITENAME/pipe" Template="my_fmt")
    stop
}

Isso funciona como pretendido. Infelizmente, o SITENAME no nome do pipe acima não é conhecido antecipadamente e deve ser configurado pelo cliente.

Eu poderia escrever instruções como "encontrar qualquer ocorrência da palavra SITENAME no arquivo e substituí-la por seu $ sitename particular" ou até mesmo entregar um comando sed , mas não gosto essa abordagem. Em vez disso, gostaria de definir uma constante no início do arquivo e usá-lo sempre que for necessário. Assim:

set ACTUAL_SITE = "foo";

template (name="my_fmt" type="string" string="<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag% %msg%\n")
if ( ... ) then {
    action(type="ompipe" Pipe="/tmp/$ACTUAL_SITE/pipe" Template="my_fmt")
    stop
}

Como posso fazer isso? Eu (acho que) tentei todas as variantes de $ , %…% e %$…% na parte Pipe="…" , mas nenhuma funcionou. O valor de ACTUAL_SITE nunca muda após a instalação inicial. Eu só quero simplificar a configuração para o cliente e dizer "definir o valor de ACTUAL_SITE para o nome do site real" e não fazê-lo mexer com o resto do arquivo.

    
por PerlDuck 22.04.2018 / 16:21

1 resposta

4

As versões rsyslog desatualizadas (8.32 e inferiores) não suportam o que você tenta fazer.

Nas versões atuais do rsyslog, você pode fazer isso através de constantes de backticks, consulte aqui .

Para fazer isso:

  • defina uma variável de ambiente (ou grave um arquivo) antes da inicialização do rsyslog, geralmente adicionando-o ao script de inicialização após a instalação na máquina de destino. Vamos chamar isso de SITE_PIPE e fazer o seguinte:

    export SITEPIPE="/tmp/mysite/pipe"
    
  • use os backticks como tal:

    action(type="ompipe" Pipe='echo $SITEPIPE' Template="my_fmt")
    

Se você escrever um arquivo, poderá usar essa construção:

action(type="ompipe" Pipe='cat pipenamefile' Template="my_fmt")

Tudo isso deve parecer familiar ao modo como o bash funciona.

Uma amostra real disso em ação pode ser encontrada em nosso contêiner da janela de encaixe. Isso aqui se vincula ao rsyslog.conf do contêiner .

Mas você também pode ver o resto das definições do Docker para obter uma imagem completa.

    
por 24.04.2018 / 13:06

Tags