首页 > 解决方案 > 如何计算logstash消息字段中的电子邮件数量?

问题描述

“2019-07-26T16:04:56.760Z,10.155.61.162,citymail4exedge,10.141.6.34,CSMAIL-DR.NYC.GOV,08D70FED2805DAAC;250 2.6.0 [InternalId=54732279] 排队的邮件发送到 CS,SMTP ,SEND,446859,,phonebook@acs.nyc.gov;vincent.fox@acs.nyc.gov,250 2.1.5 Recipient OK;250 2.1.5 Recipient OK,2697,2,,;,ACS 电话目录个人信息更新请求,phonebook@acs.nyc.gov,phonebook@acs.nyc.gov,2019-07-26T16:04:56.119Z;SRV=citymail4exedge.nycnet:TOTAL=0,Originating,,,\r"

(?<emailuser1>[\w.]+)\@(?<domain1>\w+\.\w+\.\w+)(\.\w+)?

我已经使用这个 logstash grok 模式来分别分隔电子邮件和域,并且需要在 logstash 中计算它们的数量。

  "phonebook"

“域1”:

  "acs.nyc.gov"

“电子邮件用户2:

  "vincent.fox"

“域2”:[“acs.nyc.gov”

标签: elasticsearchlogstash-grok

解决方案


我不认为你可以在 grok 中做到这一点,但你可以在 ruby​​ 中做到这一点。

    ruby {
        init => '
            EMAIL = /(([a-zA-Z][a-zA-Z0-9_\.\+\-=:]+)@\b((?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)))/
        '
        code => '
            matches = event.get("message").scan(EMAIL)
            local = []
            domain = []
            address = []
            matches.each { |x|
                unless address.include? x[0]
                    address << x[0]
                    local << x[1]
                    domain << x[2]
                end
            }
            domain.each_index { |x|
                event.set("domain#{x+1}", domain[x])
            }
            local.each_index { |x|
                event.set("emailuser#{x+1}", local[x])
            }
#                event.set("user", local)
#                event.set("domain", domain)
        '
    }

电子邮件的正则表达式基于 grok 模式,而不是您的模式。


推荐阅读