问题描述
完全公开,我是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]
我不知道我从第一个结果集中正确引用了电子邮件。 有人可以为我指出正确的搜索方向吗?
解决方法
如果我能正确理解您的要求,那么您需要执行3个步骤:
- 从
index=mail sourcetype=sendmail_syslog
获取发件人地址 - 使用这些发件人地址从
index=mail sourcetype=barracuda
中获取messageID的列表 - 使用这些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")