elasticsearch - 如何计算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”
解决方案
我不认为你可以在 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 模式,而不是您的模式。
推荐阅读
- python - 使用 Python 根据数据更改 SQL UPDATE 语句
- ios - AppDelegate 未提供 UIViewController
- python-3.x - 使用 Python 优化排序任务
- c# - 如何在不调用基本默认构造函数的情况下实例化继承的类
- node.js - 如何使用 node/express 控制台记录 api 调用的 url
- html - 修复 IE 中 mat-expansion-indicator 的位置
- php - 使用准备好的语句验证来自 MySQL 数据库的散列密码
- javascript - 在 ArcGIS 中添加要素图层
- python - 如何将具有输入名称的元组添加到列表中
- netlogo - 如何在 NetLogo 的多个位置生成多个海龟?