我只为我的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}))*)
答案 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}