Posso usar a sequência capturada regexp em caminhos rsyslog?

1

Digamos que eu queira filtrar logs para usar arquivos diferentes por ID de usuário, posso escrever uma regra por uid como aqui:

if $msg contains 'uid=500' then /var/log/uid/500
if $msg contains 'uid=501' then /var/log/uid/501
if $msg contains 'uid=502' then /var/log/uid/502

Eu gostaria de escrever uma única linha usando uma captura de expressão regular como esta:

if $msg contains 'uid=\([0-9]+\)' then /var/log/uid/

É possível e como, por favor?

    
por lalebarde 26.09.2018 / 19:06

1 resposta

2

Você pode fazer isso usando um substituto da propriedade . Coloque no seu rsyslog.conf ou similar uma linha definindo um modelo que seja o formato desejado do nome do arquivo, e use-o na ação quando você combinar com a linha de entrada. Por exemplo,

$template myfile,"/var/log/uid/%msg:R,ERE,1,FIELD:.*?uid=([0-9]+).*--end%"
if (re_match($msg, "uid=[0-9]+")) then {
 action(type="omfile" dynaFile="myfile")
 stop
}

O modelo diz que a variável de modelo myfile é a string incluindo a propriedade msg substituída por uma correspondência regex (R), estendida (ERE), captura de grupo 1 (1), (e se não houver correspondência, mantenha o CAMPO original). A regex real é a parte .*?uid=([0-9]+).* . O --end é uma parte obrigatória da sequência %...:R,...--end% .

As linhas a seguir são o teste usual do Rainer Script para as linhas que você deseja combinar e onde colocar o resultado.

    
por 26.09.2018 / 19:32