Filtro grok do Logstash para marcar as mensagens recebidas e devolvidas
Sthg me deixa louco, eu gostaria de analisar os logs do Postfix para saber o status dos emails, eis o que eu tentei até agora:
input {
file {path => "/var/log/mail.log"}
}
filter {
kv {
trim => "<>"
}
if [message] =~ /[ "status=bounced" ]/ {
grok {
patterns_dir => "/etc/logstash/patterns"
match => {"message" => "%{SYSLOGBASE} (?<QID>[0-9A-F]{10}): %{GREEDYDATA:message}"}
add_tag => "bounce"
}
}
}
output {
if "bounce" in [tags] {
stdout { codec => rubydebug }
}
}
Exemplo de mail.log:
26 de julho 04:18:34 postx / limpeza do mx12 [20659]:3mfHGL1r9gzyQP: id da mensagem = <[email protected]>
26 de julho 04:18:34 postx mx12 / smtp [20662]:3mfHGL1r9gzyQP: to =, relé = 127.0.0.2 [127.0.0.2]: 25, atraso = 0,53, atraso = 0,13 / 0 / 0,23 / 0,16, dsn = 2.0.0,status = enviado / saltou
Resultado 1:
Como envio um email para um endereço de email existente, o status em mail.log é:
enviado (250 ok): OK
Mas aqui está o que o Logstash diz:
.. e vejo que para cada mensagem gerada por cada programa postfix (qmgr, smtp, qmgr novamente ..). Em outras palavras, para todas as mensagens que ainda não contêm "status = devolvido".
Então eu também tentei:
if [message] =~ /[ "bounced" ]/ {
mutate {add_tag => [ "bounce" ]}
}
if [message] =~ /[ "message-id", "(.*)\@www\.mydomain\.fr" ]/ {
mutate { add_tag => [ "send" ] }
}
grok {
match => {"message" => "%{SYSLOGBASE} (?<QID>[0-9A-F]{10}): %{GREEDYDATA:message}"}
}
Resultado 2: Logstash adicione aqui sempre 2 tags: rejeição + envio :(
Resultado esperado:
O que eu tento fazer éexatamente esse arquivo de configuração, mas foi feito com uma versão antiga do Logstash ("grep", por exemplo, não está disponível agora), masé exatamente isso que tento fazer funcionar :
http://tales.itnobody.com/2013/07/using-logstash-to-log-smtp-bounces-like-a-boss.html
Em uma palavra :
Quaisquer entradas com um DSN - RECORD: QID, dsnQuaisquer entradas correspondentes ao ID da mensagem = <hashRegex> - RECORD: QID, ID da mensagemComo se segue :
output{
if "bounce" in [tags] {
exec {
command => "php -f /path/LogDSN.php %{QID} %{dsn} &"
}
}
if "send" in [tags] {
exec {
command => "php -f /path/LogOutbound.php %{QID} %{message-id} &"
}
}
}
Mas há um problema no meu filtro, que me deixa louco,
Qualquer ideia ??