联接数据中的Splunk查询参考字段

问题描述

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

我有两个数据源,并被询问从它们中分别提取数据。我正在尝试将这些数据结合在一起,以便可以创建某种类型的图表,但是我不确定这将是联接/搜索等。

我的初始查询如下:

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

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

搜索的结果如下:

enter image description here

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

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

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

我关注了几封电子邮件和教程,但是我看到的许多联接仅使用两个不同的源/数据集,而没有像我在第一个查询中那样使用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]

我不知道我从第一个结果集中正确引用了电子邮件。 有人可以为我指出正确的搜索方向吗?

解决方法

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

  1. index=mail sourcetype=sendmail_syslog获取发件人地址
  2. 使用这些发件人地址从index=mail sourcetype=barracuda中获取messageID的列表
  3. 使用这些messageID最终获取您要查找的事件

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

尝试以下方法:

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行删除了我们不需要的所有字段。使用以下format命令可能会出现问题。
  • 第9行将结果以某种方式传回至包围搜索,以便可以将其用作搜索字符串的一部分。
  • 第10行当然会关闭最里面的子搜索。

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

  • 第2行开始子搜索。
  • 第3行选择可以从其中获取messageID的事件。这是由于我们刚刚讨论过的封闭式子搜索而引起的。
  • 第11行再次是一种删除messageID的方法。
  • 第12行再次将事情限制在我们需要的领域。
  • 第13行将找到的messageID传递到最外面的(主)搜索,以使它们成为搜索字符串的一部分。
  • 您已经知道的第14行关闭了子搜索。

最外层的搜索:

  • 第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")