logstash - 使用预定义的 grok 过滤器将单词连接到电子邮件
问题描述
首先感谢您阅读我的问题。我在日志中有一个电子邮件地址,格式如下,
Apr 24 19:38:51 ip-10-0-1-204 sendmail[9489]: w3OJco1s009487: sendid:name@test.co.uk, 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)
我需要提取电子邮件以及单词 sendid
输出应该是这样的,
{
"DATA": [
[
"sendid:name@test.co.uk"
]
]
}
我试过关注,但它只提取我在这里测试过的电子邮件, http: //grokdebug.herokuapp.com/,
sendid:%{DATA},
如何在不创建新字段或定义新正则表达式的情况下将单词 sendid: 连接到电子邮件?有人可以帮忙吗?
我也试过这个,但它不起作用,
sendid:%{"sendid:"} %{DATA},
解决方案
您sendid:%{DATA},
将无法工作,因为您在 grok 模式之外提供的任何内容都与环境匹配,在您的情况下,介于sendid:
和之间的所有内容都,
将被匹配,它会给您,
{
"DATA": [
[
"name@test.co.uk"
]
]
}
您需要创建自定义模式并将其与解决方案的预定义模式相结合,因为您不能完全使用任何预定义模式。
Logstash 允许您在这种情况下使用 Oniguruma 正则表达式库创建自定义模式。语法是,
(?<field_name>the pattern here)
在你的情况下,
\b(?<data>sendid:%{EMAILADDRESS})\b
输出:
{
"data": [
[
"sendid:name@test.co.uk"
]
],
"EMAILADDRESS": [
[
"name@test.co.uk"
]
],
"EMAILLOCALPART": [
[
"name"
]
],
"HOSTNAME": [
[
"test.co.uk"
]
]
}
推荐阅读
- php - 如何仅更新 Laravel 表单中的一个输入?
- c# - 如何在我的窗口服务应用程序中修复我的 Web API 调用的 400 错误请求
- makefile - *** 尽管使用了制表符,但缺少分隔符
- javascript - 如何在mongodb中加入两个表并推入数组
- python - Keras 在第一个纪元结束时显示形状错误
- azure-active-directory - Microsoft Graph API 获取用户拥有的 AAD 组列表
- c# - 通过 Assemby/NuGet 包 OxyPlot 的调试
- regex - 使用python从句子中仅提取2位数字的方法是什么
- android-ndk - NDK 模板实例化无法编译运算符 <<
- mysql - 只有当字段具有特定值时,mysql才加入