Logstash Ruby Filter以匹配电子邮件地址

时间:2016-07-25 18:21:08

标签: regex logstash logstash-grok logstash-configuration

我有一个ruby过滤器,希望能够匹配日志消息中的电子邮件地址,删除它,并通过匿名过滤器传递它,就像这样......

  ruby { 
  code =>
    "
    begin
      if !event['log_message'].nil?
        if match = event['log_message'].match(/(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)/i) 
          event['user_email'] = match[1]
        end
      else
        puts 'Oddity parsing message: log_message is nil'
        puts event.to_yaml
      end
    rescue Exception => e
      puts 'Exception parsing user email:'
      puts e.message
    end
    "
}
if [user_email] {
  anonymize {  
    algorithm => "SHA1"
    fields => ["user_email"]
    key => "mySuperSecretPassword"
  }
  ruby {
    code =>
      "
      begin
        event['message'].gsub!(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i, event['user_email'])
        event['log_message'].gsub!(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i, event['user_email'])
      rescue Exception => e
        puts 'Exception replacing user-email in log:'
        puts e.message
      end
      "
      remove_field => ["user_email"]              
  }
}

到目前为止,这个正则表达式并没有抓住任何东西。我尝试替换它,我得到一个错误(这是我的代码的“奇怪的解析消息”分支)。

有谁知道大致如何做到这一点?我不需要一个疯狂的over-the-top正则表达式,只需一个可以捕获99%的电子邮件地址。我试图使用的正则表达式是

if match = event['log_message'].match(/(\b[a-zA-Z0-9_.+=:-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.(?:[0-9A-Za-z][0-‌​9A-Za-z-]{0,62}))*\b)/i)

这是一个参考日志行

76817815   11/Jun/2016 00:04:28 +0000  INFO  [eventListener-3] messagingsvc logDefault    > doSend - Sending email... From: "Test" <do-not-reply@test.com>

注意如果使用Grok可以更容易/更安心地完成此操作,我完全可以删除ruby位。

1 个答案:

答案 0 :(得分:1)

这是来自html5规范

 [a-zA-Z0-9.!#$%&'*+/=?^_\`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*

扩展

 [a-zA-Z0-9.!#$%&'*+/=?^_\`{|}~-]+ 
 @
 [a-zA-Z0-9] 
 (?: [a-zA-Z0-9-]{0,61} [a-zA-Z0-9] )?
 (?:
      \. [a-zA-Z0-9] 
      (?: [a-zA-Z0-9-]{0,61} [a-zA-Z0-9] )?
 )*