Я искал в Google последние несколько дней в поисках надежного примера того, как регулярное выражение записи журнала для желаемых данных, которые затем должны быть вставлены в базу данных, но, видимо, моего google-fu не хватает.
Я пытаюсь отслеживать, когда отправлено электронное письмо, а затем отслеживать удаленный ответ mta, в частности, код dsn. На данный момент у меня есть два шаблона для каждой ситуации:
# /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
& ~
Примеры записей журнала:
MPurcell: CUSTOM HEADER Template: D921940A1A: prepend: header X-custom_header: 101 from localhost[127.0.0.1]; from=<noreply@myapp.com> to=<me@gmail.com> proto=ESMTP helo=<localhost>: headername: message-id
MPurcell: RESPONSE DSN Template: D921940A1A: to=<me@gmail.com>, 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)
Из шаблона CUSTOM HEADER я хотел бы извлечь: D921940A1A и значение X-custom_header; 101
Я хотел бы извлечь из шаблона RESPONSE DSN: D921940A1A и "dsn = 2.0.0"
Если кто-то окажется в такой же ситуации, вот что я в итоге сделал:
# /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"
Чтобы проверить свои регулярные выражения, вы должны использовать: http://www.rsyslog.com/regex/, это немного банально, но выполняет свою работу.
Пример необработанных записей журнала, немного измененных с 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=<noreply@myapp.com> to=<me@gmail.com> proto=ESMTP helo=<localhost>: headername: message-id
Jun 29 05:40:30 service1 mail-myapp/smtp[22201]: 6F67240A1A: to=<me@gmail.com>, 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)
Как они выглядят после применения шаблонов:
6F67240A1A | 136
6F67240A1A | 2.0.0
Когда я вставляю в mysql, я собираюсь вставить dsn как int vs string для повышения производительности, поэтому думаю об использовании этого:
insert into response_log_dsn set mail_id = '6F67240A1A', dsn = (select cast(replace('2.0.0', '.', '') as unsigned));