我的日志中有以下行:
...useremail=abc@fdsf.com id=1234 ....
...useremail=pqr@fdsf.com id=4565 ....
...useremail=xyz@fdsf.com id=5773 ....
我可以在Splunk中实现这一目标吗?
谢谢!
答案 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/