【问题标题】:Splunk query reference field in joined data联接数据中的 Splunk 查询引用字段
【发布时间】:2020-09-15 15:43:19
【问题描述】:

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

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

我的初始查询如下:

这使我可以按发件人地址搜索邮件日志,并显示所有带有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

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

我关注了一些电子邮件和教程,但我看到的很多连接只使用了两个不同的源/数据集,并且没有像我在第一个查询中那样使用 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]

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

【问题讨论】:

    标签: splunk splunk-query splunk-formula


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

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

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

    还有最外层的搜索:

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

    【讨论】:

    • 太棒了,非常感谢您的详细回复。我很快就会在这里测试并让你知道。出于好奇,因为我对 Splunk 不是很熟悉,日期搜索是否适用于所有搜索,还是仅适用于外部/内部?例如,如果我选择“今天”,它会将该日期应用于所有 3 次搜索的结果,还是需要明确?
    • @SBB:选择的时间范围对所有三个搜索都有效。如果您想更改其中一项搜索的时间范围,您需要对该(子)搜索使用 early=latest=。
    【解决方案2】:

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

    【讨论】:

    • 这看起来很有希望,但我遇到了一个问题,即没有返回任何事件。在我最初的示例中,返回了 2 个事件。一个事件不包含bcSenderbcSendAction,另一个包含。 bcMsgId 是这两个事件的共同点,允许我组合在一起,以便我可以使用 bcSenderbcSendAction 值找到事件。我相信我仍然需要它存在才能完成这项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多