3

我的日志中有以下几行:

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

我可以在 Splunk 中实现这一点吗?

谢谢!

4

1 回答 1

3

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

1) 捕获从 -1d@d 到 @d 期间的所有用户 ID

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

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

2) 对于每个用户,从索引开始搜索直到 -1d@d 并通过比较实际 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使用 a对整个子搜索修改该搜索,并将外部搜索通过管道传输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/

于 2011-09-27T21:33:47.743 回答