查询循环访问splunk中的数据

时间:2011-09-24 01:25:15

标签: splunk

我的日志中有以下行:

...useremail=abc@fdsf.com id=1234 ....
...useremail=pqr@fdsf.com id=4565 ....
...useremail=xyz@fdsf.com id=5773 ....
  1. 捕获从-1d @ d到@d
  2. 期间的所有用户ID
  3. 对于每个用户,从索引的开头搜索直到-1d @ d&通过比较实际的id字段来查看用户ID是否已存在
  4. 如果不存在,则将其添加到计数器
  5. 显示此最终计数。
  6. 我可以在Splunk中实现这一目标吗?

    谢谢!

1 个答案:

答案 0 :(得分:3)

是的,在Splunk中有几种方法可以做到这一点,每种方法都有不同程度的易用性和扩展能力。我将逐步完成子搜索方法:

1)捕获从-1d @d到@d

期间的所有用户ID

您希望首先验证仅返回ID列表的搜索,然后将其转换为子搜索:

sourcetype=<MY_SOURCETYPE> earliest=-1d@d latest=-@d | stats values(id) AS id

2)对于每个用户,从索引的开头搜索直到-1d @ d&amp;通过比较实际ID字段

来查看用户ID是否已存在

使用不同的时间帧构建主搜索,使用(1)中的子搜索来匹配这些ID(请注意,子搜索必须以search开头):

sourcetype=<MY_SOURCETYPE> [search sourcetype=<MY_SOURCETYPE> earliest=-1d@d latest=-@d | stats values(id) AS id] earliest=0 latest=-1d@d

这将从索引的开头返回所有事件的原始数据集,但不包括包含(1)中的ID的1d @ d。

3)如果不存在,则将其添加到计数器

使用NOT针对整个子搜索修改该搜索,并将外部搜索管道传输到stats以查看匹配的ID:

sourcetype=<MY_SOURCETYPE> NOT [search sourcetype=<MY_SOURCETYPE> earliest=-1d@d latest=-@d | stats values(id) AS id] earliest=0 latest=-1d@d | stats values(id)

4)显示此最终计数。

修改最后一个stats命令以返回一个不同的计数:

sourcetype=<MY_SOURCETYPE> NOT [search sourcetype=<MY_SOURCETYPE> earliest=-1d@d latest=-@d | stats values(id) AS id] earliest=0 latest=-1d@d | stats dc(id)

效果考虑因素:

上述方法适用于商品硬件上100万行以下的数据集。问题是子搜索是阻塞的,因此外部搜索需要等待。如果您有更大的数据集需要处理,那么需要使用替代方法来使其成为有效的搜索。

仅供参考,Splunk有一个专门的网站,您可以更快地获得此类问题的答案:http://splunk-base.splunk.com/answers/