使用Grok匹配自定义格式邮箱及ELK解析Sendmail邮件日志求助
没问题,我帮你搞定这两个Grok匹配的问题!先从你给出的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)
我给你写了一个精准匹配这个格式的Grok模式,你可以直接拿到调试网站里测试:
%{MONTH:log_month} %{MONTHDAY:log_day} %{TIME:log_time} %{HOSTNAME:server_hostname} %{PROG:mail_program}\[%{POSINT:process_id}\]: %{DATA:queue_id}: to=%{QS:recipient_email}, delay=%{DATA:total_delay}, xdelay=%{DATA:smtp_delay}, mailer=%{DATA:mailer_type}, pri=%{NUMBER:message_priority}, relay=%{DATA:relay_host} \[%{IP:relay_ip}\], dsn=%{DATA:delivery_status_code}, stat=%{DATA:delivery_status} \(.*\)
每个字段的说明:
%{MONTH:log_month}:匹配日志里的月份(比如Apr)%{MONTHDAY:log_day}:匹配日期(比如24)%{TIME:log_time}:匹配时间(比如19:38:51)%{HOSTNAME:server_hostname}:匹配服务器主机名(比如ip-10-0-1-204)%{PROG:mail_program}\[%{POSINT:process_id}\]:匹配sendmail进程和对应ID(比如sendmail[9489])%{DATA:queue_id}:匹配Sendmail的邮件队列ID(比如w3OJco1s009487)%{QS:recipient_email}:匹配带尖括号的收件人邮箱(username@domain.us,QS模式会自动处理这类包裹式内容)- 后面的
delay、xdelay等字段用%{DATA}匹配键值对的值,relay部分额外提取了对应的IP地址%{IP:relay_ip} - 如果需要提取
stat字段括号里的具体内容,可以把最后一段改成stat=%{DATA:delivery_status} \(%{DATA:status_details}\)
测试的时候,把日志贴到调试工具的“Sample Data”框,把上面的Grok模式贴到“Pattern”框,就能看到每个字段都被正确解析了。如果你的Sendmail日志有其他变体(比如包含from字段),直接在模式里对应添加即可。
如果内置的%{EMAILADDRESS}模式满足不了你的自定义邮箱格式(比如前缀包含特殊字符、有特定命名规则,比如xxx_yyy@company.com),你可以自己写正则来适配:
方法1:直接在Grok模式里嵌入正则
比如如果你的邮箱前缀允许字母、数字、下划线、连字符,域名允许字母、数字、点和连字符,可使用:
(?<custom_email>[a-zA-Z0-9_\-]+@[a-zA-Z0-9\-\.]+)
把这段直接放到你的Grok模式里,就能匹配符合规则的自定义邮箱。
方法2:自定义可复用的Grok模式
如果需要在多个配置里复用这个规则,你可以在ELK的patterns目录(通常是/etc/logstash/patterns)新建一个文件,比如custom_patterns,然后添加一行:
CUSTOM_EMAIL [a-zA-Z0-9_\-]+@[a-zA-Z0-9\-\.]+
之后在你的Grok模式里就可以像用内置模式一样,写%{CUSTOM_EMAIL:recipient_email}来调用。
举个更具体的例子:如果你的自定义邮箱要求前缀必须是数字加字母,域名必须是*.company.us,正则可以改成:
(?<custom_email>[a-zA-Z0-9]+@[a-zA-Z0-9]+\.company\.us)
根据你的实际格式调整正则规则即可。
内容的提问来源于stack exchange,提问作者A. Kendall

