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

Using grok to match custom style email address

我刚刚为我的 apache 日志设置了一个 ELK 堆栈。它工作得很好。现在我想添加邮件日志,但我在使用 grok 解析日志时遇到了问题。

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

这是一个示例邮件日志 (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= 的电子邮件地址。

我试过了,结果是 "no matches":

(?<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}))*)

您可以使用

\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 个字母、数字或 -
    • > - 一个 > 字符
  • ) - 小组结束。

这很简单,它创建一个自定义模式来匹配 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}