使用grok匹配自定义样式的电子邮件地址

时间:2018-04-25 21:21:10

标签: regex logstash elastic-stack logstash-grok

我只为我的apache日志设置了一个ELK堆栈。它工作得很好。现在我想添加maillogs,我在用grok解析日志时遇到了麻烦。

我正在使用此网站进行调试: https://grokdebug.herokuapp.com/

以下是maillog(sendmail)条目的示例:

Apr 24 19:38:51 ip-10-0-1-204 sendmail[9489]: w3OJco1s009487: to=<username@domain.us>, delay=00:00:01, xdelay=00:00:01, mailer=smtp, pri=120318, relay=webmx.bglen.net. [10.0.3.231], dsn=2.0.0, stat=Sent (Ok: queued as E2DEF60724), w3OJco1s009487: to=<username@domain.us>, delay=00:00:01, xdelay=00:00:01, mailer=smtp, pri=120318, relay=webmx.[redacted].net. [10.0.3.231], dsn=2.0.0, stat=Sent (Ok: queued as E2DEF60724)

从上面的文字中,我想提取文字to=<username@domain.us>

到目前为止,我有一个grok模式:

(?<mail_sent_to>[a-zA-Z0-9_.+=:-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.(?:[0-9A-Za-z][0-‌​9A-Za-z-]{0,62}))*)

它给我的结果username@domain.us>很好,但我希望它在前面也有to=。我只希望这个grok过滤器匹配前面有to=的电子邮件地址。

我尝试了这个,但结果却让我“没有匹配”:

(?<mail_sent_to>"to="[a-zA-Z0-9_.+=:-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.(?:[0-9A-Za-z][0-‌​9A-Za-z-]{0,62}))*)

2 个答案:

答案 0 :(得分:2)

您可以使用

\b(?<mail_sent_to>to=<[a-zA-Z0-9_.+=:-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.[0-9A-Za-z][0-9A-Za-z-]{0,62})*>)

或者,因为[a-zA-Z0-9_]匹配与\w相同的字符:

\b(?<mail_sent_to>to=<[\w.+=:-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.[0-9A-Za-z][0-9A-Za-z-]{0,62})*>)

请参阅regex demo

<强>详情

  • \b - 字边界
  • (?<mail_sent_to> - “mail_sent_to”组:
    • to=< - 文字字符串to=<
    • [\w.+=:-]+ - 1 +字,.+=:-字符
    • @ - @字符
    • [0-9A-Za-z] - 一个字母数字字符
    • [0-9A-Za-z-]{0,62} - 0到62个字母,数字或-
    • (?:\.[0-9A-Za-z][0-9A-Za-z-]{0,62})* - 0+序列
      • \. - 一个点
      • [0-9A-Za-z] - 一个字母数字字符
      • [0-9A-Za-z-]{0,62} - 0到62个字母,数字或-
    • > - >字符
  • ) - 小组结束。

答案 1 :(得分:2)

这很简单,它会创建一个自定义模式以匹配to=<>,以及pre-defined EMAILADDRESS来匹配电子邮件地址。

\b(?<mail_sent_to>to=<%{EMAILADDRESS}>)

这将输出,

{
  "mail_sent_to": [
    [
      "to=<username@domain.us>"
    ]
  ],
  "EMAILADDRESS": [
    [
      "username@domain.us"
    ]
  ],
  "EMAILLOCALPART": [
    [
      "username"
    ]
  ],
  "HOSTNAME": [
    [
      "domain.us"
    ]
  ]
}

修改

电子邮件的模式是,

EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+
EMAILADDRESS %{EMAILLOCALPART}@%{HOSTNAME}