rsyslog - modelo - dados regex para inserção no banco de dados

1

Eu andei pesquisando nos últimos dias procurando um exemplo sólido de como regexar uma entrada de log para os dados desejados, que deve ser inserido em um banco de dados, mas aparentemente meu google-fu está faltando.

O que estou tentando fazer é rastrear quando um email é enviado e, em seguida, rastrear a resposta mta remota, especificamente o código dsn. Neste ponto, tenho dois modelos de configuração para cada situação:

# /etc/rsyslog.conf
...
$Template tpl_custom_header, "MPurcell: CUSTOM HEADER Template: %msg%\n"
$Template tpl_response_dsn, "MPurcell: RESPONSE DSN Template: %msg%\n"

# /etc/rsyslog.d/mail
if $programname == 'mail-myapp' then /var/log/mail/myapp.log
if ($programname == 'mail-myapp') and ($msg contains 'X-custom_header') then /var/log/mail/test.log;tpl_custom_header
if ($programname == 'mail-myapp') and ($msg contains 'dsn=') then /var/log/mail/test.log;tpl_response_dsn
& ~

Exemplo de entradas de registro:

MPurcell: CUSTOM HEADER Template:  D921940A1A: prepend: header X-custom_header: 101 from localhost[127.0.0.1]; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<localhost>: headername: message-id

MPurcell: RESPONSE DSN Template:  D921940A1A: to=<[email protected]>, relay=gmail-smtp-in.l.google.com[2607:f8b0:400e:c02::1a]:25, delay=2, delays=0.12/0.01/0.82/1.1, dsn=2.0.0, status=sent (250 2.0.0 OK 1372378600 o4si2828280pac.279 - gsmtp)

Do modelo PERSONALIZADOR PERSONALIZADO, gostaria de extrair: D921940A1A e valor X-custom_header; 101

A partir do modelo DSN RESPONSE, gostaria de extrair: D921940A1A e "dsn = 2.0.0"

    
por Mike Purcell 28.06.2013 / 20:04

1 resposta

0

Caso alguém acabe enfrentando a mesma situação, aqui está o que acabei fazendo:

# /etc/rsyslog.conf

# Not sure what R signifies but saw it in other examples
# ERE = extended regex
# 0 = The submatch we want
# DFLT = How should a non match be returned?
$Template tpl_custom_header, "%msg:R,ERE,0,DFLT:[^:]+--end% | %msg:R,ERE,2,DFLT:X-custom_header:( )([0-9]*)--end%\n"    
$Template tpl_response_dsn, "%msg:R,ERE,0,DFLT:[^:]+--end% | %msg:R,ERE,1,DFLT:dsn=([0-9][.][0-9][.][0-9])--end% \n"

Para testar seus regexes, você deve usar: link , é um pouco piegas, mas faz o trabalho.

Exemplo de entradas de log brutas, ligeiramente alteradas do OP:

Jun 29 05:40:28 service1 mail-myapp/cleanup[22200]: 6F67240A1A: prepend: header X-custom_header: 136 from localhost[127.0.0.1]; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<localhost>: headername: message-id

Jun 29 05:40:30 service1 mail-myapp/smtp[22201]: 6F67240A1A: to=<[email protected]>, relay=gmail-smtp-in.l.google.com[2607:f8b0:400e:c01::1a]:25, delay=2, delays=0.09/0/0.82/1, dsn=2.0.0, status=sent (250 2.0.0 OK 1372485254 rs6si5760686pbc.32 - gsmtp)

Como eles se parecem depois que os modelos foram aplicados:

 6F67240A1A | 136
 6F67240A1A | 2.0.0

Quando eu insiro no mysql, eu vou inserir dsn como int vs string para melhor performance, então pensando em usar isto:

 insert into response_log_dsn set mail_id = '6F67240A1A', dsn = (select cast(replace('2.0.0', '.', '') as unsigned));
    
por 29.06.2013 / 22:09