我希望从单个日志行中提取同一字段的多个实例。 例如,假设我有以下日志记录:
Recipients: alice@somedomain.com bob@someotherdomain.com carl@carlsplace.org
我事先不知道会列出多少个电子邮件地址。
与此相关,在一些早期的工作中,我处理了如下所示的日志记录:
Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=11522, Step=11806
在这种情况下,我利用了kv{}
过滤器,它自动生成了一个漂亮的多值字段,如下所示:
"Step": [
"12305",
"11006",
"11001",
"11018",
"12304",
"11522",
"11806"
],
我想获得与我的结果相同的多值字段,但不能简单地再次使用 kv,因为实际的对数行比我的原始示例更混乱。 实际的日志行更像这样:
Recipients: Unwanted_text alice@somedomain.com other junk bob@someotherdomain.com some.hostname.net 1 carl@carlsplace.org even-more
我想要一个 grok 表达式,它可以捕获 N 个电子邮件地址 (%{EMAILADDRESS}
),无论它们在日志行中的哪个位置,并将它们放入多值字段中。 有人可以建议如何做到这一点吗?
谢谢
克里斯
input{
beats{
port => #specify_your_port_here
}
}
filter{
mutate{
gsub => [
"message","([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))","email=1"
]
}
kv{
source => "message"
}
}
output{
elasticsearch{
host => "localhost:9200"
index => "manual"
document_type => "log"
}
}
我测试了上面的配置文件,其中 filebeat 从文件中读取输入日志并将其发送到 logstash。
解释:->
我使用
gsub
将输入message
中出现的所有电子邮件地址替换为email=
和捕获的电子邮件地址。这里使用的正则表达式只不过是用于 grok 中电子邮件地址的正则表达式,我只是添加了一个捕获组以捕获电子邮件地址。
然后我使用电子邮件地址提取电子邮件地址。
例如:->
输入消息 ->
Recipients: Recipients: Unwanted_text alice@somedomain.com other junk bob@someotherdomain.com some.hostname.net 1 carl@carlsplace.org even-more
gsub 将输入消息转换为 :->
Recipients: Unwanted_text email=alice@somedomain.com other junk email=bob@someotherdomain.com some.hostname.net 1 email=carl@carlsplace.org even-more
然后 KV 过滤器创建一个包含所有电子邮件地址的数组"电子邮件">
"email": [
"alice@somedomain.com",
"bob@someotherdomain.com",
"carl@carlsplace.org"
]
您可以像下面这样使用正则表达式,然后捕获字符串中的所有匹配项:
[wd_]*?@[w]*?.[w]{2,3}.?[w]?
演示:https://regex101.com/r/kDUoi5/2
测试:
Recipients: Unwanted_text alice@somedomain.com other junk bob@someotherdomain.com some.hostname.net 1 carl@carlsplace.org even-more
火柴:
Match 1
Full match 26-46 `alice@somedomain.com`
Match 2
Full match 58-81 `bob@someotherdomain.com`
Match 3
Full match 102-121 `carl@carlsplace.org`