连接数据中的 Splunk 查询引用字段

Splunk query reference field in joined data

完全公开,我是 Splunk 的新手,所以我可能会错误地解释我的问题。

我有两个数据源,并被要求分别从它们中提取数据。我正在尝试将这些数据连接在一起,以便创建某种类型的图表,但我不确定这会是 join/search 等

我的初步查询如下:

这让我可以按发件人地址搜索邮件日志,并显示所有带有 bcSendAction=1 的电子邮件,这是成功发送。

index=mail sourcetype=barracuda [search index=mail sourcetype=barracuda bcSender="someemail@domain.com" | table bcMsgId] bcSendAction=1

本次搜索结果如下:

现在,我的另一个搜索是显示特定时间段内所有发件人电子邮件地址的日志。我想在第一次搜索中使用此结果(电子邮件值),这样我就不必对 bcSender 进行硬编码,而是让它使用其他来源的结果。

// Returns an email address
index=mail sourcetype=sendmail_syslog *@sfdc.net |  
rex field=from "<(?<from>.*)>" | 
table from | dedup from

我能够解析日志并提取出我想用于插入我的第一次搜索的电子邮件地址。

我关注了一些电子邮件和教程,但我看到的很多联接只使用了两个不同的 sources/datasets,并没有像我在第一个查询中那样使用 search

我的尝试是这样的:

index=mail sourcetype=sendmail_syslog *@sfdc.net 
|  rex field=from "<(?<from>.*)>" 
| table from | dedup from 
|  join from 
    [search index=mail sourcetype=barracuda [search index=mail sourcetype=barracuda bcSender=from | table  bcMsgId] bcSendAction=1]

我不知道我是否正确引用了第一个结果集中的电子邮件。 有人可以为我指明正确的方向,告诉我如何进行此搜索吗?

join 的一侧是单个字段表明它很适合进行子搜索。首先进行子搜索 运行,然后它们的结果成为主搜索的一部分。

index=mail sourcetype=barracuda bcSendAction=1 
[ search index=mail sourcetype=sendmail_syslog *@sfdc.net 
  | rex field=from "<(?<from>.*)>" 
  | fields from | rename from as bcSender | format ] 

重要的是子搜索的结果包含主搜索中存在的字段。这就是我使用 rename.

的原因

在子搜索 运行 之后,您将得到一个等同于此的搜索:

index=mail sourcetype=barracuda bcSendAction=1 (bcSender="someemail@domain.com" OR bcSender="anotheremail@domain.com")

如果我正确理解了您的要求,那么您需要 3 个步骤:

  1. index=mail sourcetype=sendmail_syslog
  2. 获取发件人地址
  3. 使用这些发件人地址从 index=mail sourcetype=barracuda
  4. 获取 messageID 列表
  5. 使用这些消息 ID 最终获得您正在寻找的事件

这听起来好像您需要在另一个子搜索(用于获取消息 ID)中进行子搜索(用于获取发件人地址),这意味着您自己的尝试已经指向了正确的方向。

尝试以下方法:

index=mail sourcetype=barracuda bcSendAction=1
  [ search
    index=mail sourcetype=barracuda
      [ search
        index=mail sourcetype=sendmail_syslog *@sfdc.net 
        | rex field=from "<(?<bcSender>.*)>" 
        | stats count by bcSender
        | fields bcSender
        | format
      ]
    | stats count by bcMsgId
    | fields bcMsgId
    | format
  ]

没有你的数据我无法真正验证它,但我会尝试解释它应该做什么。让我们从最里面的子搜索开始。

  • 第 4 行开始最内层子搜索
  • 第 5 行选择生成地址列表的事件
  • 第 6 行将地址直接提取到字段 bcSender 中。 (我们可以先提取到字段from,然后重命名,但是这样更直接。) 对于外部搜索,我们需要字段名是 bcSender
  • 第 7 行是通过 bcSender 进行重复数据删除的另一种方式,同时减少了需要从索引器发送回搜索头的数据量(如果您有分布式环境)。
  • 第 8 行删除了我们不需要的所有字段。他们使用以下格式命令会有问题。
  • 第 9 行将结果返回给封闭式搜索,以便它可以用作搜索字符串的一部分。
  • 第 10 行当然关闭了最里面的子搜索。

现在让我们看看外部子搜索。

  • 第 2 行开始子搜索。
  • 第 3 行选择我们可以从中获取消息 ID 的事件。这当然是由我们刚才讨论的封闭子搜索增强的。
  • 第 11 行也是一种删除消息 ID 的方法。
  • 第 12 行再次将内容限制在我们需要的字段中。
  • 第 13 行将找到的 messageID 传递给最外层(主要)搜索,使它们成为搜索字符串的一部分。
  • 第 14 行,您已经知道,关闭子搜索。

最外层搜索:

  • 第 1 行选择您要定位的数据,并通过子搜索传递给它的内容进行扩充。