Estou escrevendo um aplicativo que inclui uma configuração rsyslog que é colocada em /etc/rsyslog.d/
.
Certas mensagens de log devem ser redirecionadas para um pipe nomeado, assim:
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 específico" ou até mesmo fornecer um sed
comando, mas não gosto dessa abordagem. Em vez disso, gostaria de definir uma constante no início do arquivo e usá-la sempre que necessário. Igual a:
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 Pipe="…"
parte, 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 "defina o valor de ACTUAL_SITE para o nome do seu site real" e não fazê-lo mexer no resto do arquivo.
Versões desatualizadas
rsyslog
(8.32 e inferiores) não suportam o que você tenta fazer.Nas versões atuais do rsyslog, você pode fazer isso por meio de constantes backticks, veja aqui .
Para fazer isso:
defina uma variável de ambiente (ou grave um arquivo) antes da inicialização do rsyslog, geralmente adicionando-a ao script de inicialização durante a instalação na máquina de destino. Vamos chamar isso de SITE_PIPE e fazer o seguinte:
então, use backticks como tal:
Se você escrever um arquivo, você pode usar esta construção:
Tudo isso deve parecer familiar para o funcionamento do bash.
Uma amostra real disso em ação pode ser encontrada em nosso contêiner docker. Isso aqui está vinculado ao rsyslog.conf do contêiner .
Mas você também pode consultar o restante das definições do Docker para obter uma visão geral.