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



我刚刚为我的apache日志设置了麋鹿堆栈。它运作良好。现在我想在混音中添加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}))*)

您可以使用

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

请参阅正则演示。

详细信息

  • b-单词边界
  • (?<mail_sent_to>-" mail_sent_to"组:
    • to=<-字符串to=<
    • [w.+=:-]+-1 字, .+=:- chars
    • @- @ char
    • [0-9A-Za-z]-字母数字char
    • [0-9A-Za-z-]{0,62}-0至62个字母,数字或-
    • (?:.[0-9A-Za-z][0-9A-Za-z-]{0,62})*-0 序列
      • .- dot
      • [0-9A-Za-z]-字母数字char
      • [0-9A-Za-z-]{0,62}-0至62个字母,数字或-
    • > -a > char
  • )-组的结束。

这很简单,它创建了一个自定义模式以匹配 to=<>,并预定的电子邮件address匹配电子邮件地址。

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}

最新更新