Regex 将多个字段数据实例从单个日志行提取到多值字段中

Regex 将多个字段数据实例从单个日志行提取到多值字段中,regex,logstash,logstash-grok,Regex,Logstash,Logstash Grok,我希望从单个日志行中提取同一字段的多个实例。例如,假设我有以下日志记录: Recipients: alice@somedomain.com bob@someotherdomain.com carl@carlsplace.org 我事先不知道会列出多少个电子邮件地址 与此相关,在以前的一些工作中,我处理的日志记录如下所示: Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=11522, Step=11806 "St

我希望从单个日志行中提取同一字段的多个实例。例如,假设我有以下日志记录:

Recipients: alice@somedomain.com bob@someotherdomain.com carl@carlsplace.org
我事先不知道会列出多少个电子邮件地址

与此相关,在以前的一些工作中,我处理的日志记录如下所示:

Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=11522, Step=11806
"Step": [
      "12305",
      "11006",
      "11001",
      "11018",
      "12304",
      "11522",
      "11806"
    ],
Recipients: Unwanted_text alice@somedomain.com other junk bob@someotherdomain.com some.hostname.net 1 carl@carlsplace.org even-more
在这种情况下,我利用了
kv{}
过滤器,它自动生成一个漂亮的多值字段,如下所示:

Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=11522, Step=11806
"Step": [
      "12305",
      "11006",
      "11001",
      "11018",
      "12304",
      "11522",
      "11806"
    ],
Recipients: Unwanted_text alice@somedomain.com other junk bob@someotherdomain.com some.hostname.net 1 carl@carlsplace.org even-more
我希望得到与我的结果相同的多值字段,但不能简单地再次使用kv,因为实际的对数线比我最初的示例更混乱。实际的日志行更像这样:

Step=12305, Step=11006, Step=11001, Step=11018, Step=12304, Step=11522, Step=11806
"Step": [
      "12305",
      "11006",
      "11001",
      "11018",
      "12304",
      "11522",
      "11806"
    ],
Recipients: Unwanted_text alice@somedomain.com other junk bob@someotherdomain.com some.hostname.net 1 carl@carlsplace.org even-more
我想要一个grok表达式,它可以捕获N个电子邮件地址(
%{EMAILADDRESS}
),无论它们在日志行中的什么位置,并将它们放入多值字段中。有人能建议怎么做吗

谢谢


Chris

您可以像下面这样使用正则表达式,然后捕获字符串中的所有匹配项:

[\w\d_]*?@[\w]*?\.[\w]{2,3}\.?[\w]?
演示:

测试:

匹配:

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`
我测试了上面的配置文件,其中filebeat从文件中读取输入日志并将其发送到logstash

说明:->

  • 我使用
    gsub
    将输入
    message
    中出现的所有电子邮件地址替换为
    email=
    和捕获的电子邮件地址

  • 这里使用的正则表达式只是grok中用于电子邮件地址的正则表达式,我只是添加了一个捕获组来捕获电子邮件地址

  • 然后我使用电子邮件地址提取电子邮件地址

  • 例:->

    输入消息->

    收件人:收件人:不需要的文本alice@somedomain.com其他垃圾bob@someotherdomain.comsome.hostname.net 1carl@carlsplace.org更多

    gsub将输入消息转换为:->

    收件人:不需要的\u文本电子邮件=alice@somedomain.com其他垃圾邮件=bob@someotherdomain.comsome.hostname.net 1电子邮件=carl@carlsplace.org更多

    然后kv过滤器创建一个包含所有电子邮件地址的数组“email”

    "email": [
        "alice@somedomain.com",
        "bob@someotherdomain.com",
        "carl@carlsplace.org"
    ]
    

    您可能需要使用ruby/code筛选器删除不需要的文本/将电子邮件解析到列表我了解您的正则表达式,但我不了解匹配项是如何捕获到命名字段的。可能此链接可以帮助您:是的,
    mutate
    /
    gsub
    看起来是一个非常好的解决方案。非常感谢。我以前不知道gsub的事。