首页 > 解决方案 > 使用预定义的 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},

标签: logstashlogstash-grok

解决方案


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"
    ]
  ]
}

推荐阅读