如何通过Splunk SPL提取SQL日志中的搜索词并统计热门搜索?
这个需求挺常见的,我之前也处理过类似的日志提取场景。要从SQL语句里捕获search_term的值,核心是用Splunk的rex命令做正则提取,然后再用top统计就行,给你具体的解决方案:
基础版SPL查询
如果你的搜索词里没有转义的单引号(比如不会出现'don\'t'这种格式),用下面的查询就足够了:
index=my_app | rex "search_term = '(?<search_term>[^']+)'" | top search_term
各部分解释:
index=my_app:先定位到你的Web应用日志索引rex "search_term = '(?<search_term>[^']+)'":这一步是关键,用正则表达式从事件文本里提取搜索词。(?<search_term>[^']+)是命名捕获组,[^']+会匹配单引号之间的所有非单引号字符,把结果存到search_term这个自定义字段里top search_term:自动统计每个搜索词的出现次数,默认按频次降序显示前10个,如果想多看点结果,可以加limit参数,比如top limit=20 search_term
处理带转义单引号的情况
如果你的搜索词里可能包含转义的单引号(比如用户搜索了don't,日志里的SQL会写成search_term = 'don\'t'),上面的正则会提前截断,这时候需要调整正则来匹配转义的单引号:
index=my_app | rex "search_term = '(?<search_term>(?:[^']|\\\\')+)'" | top search_term
这里的(?:[^']|\\\\')+表示匹配「非单引号字符」或者「转义的单引号」,Splunk里反斜杠需要双重转义,所以写成\\\\'来匹配日志里的\'
小技巧
- 可以先加
| table _raw search_term来验证提取是否正确,确保每个事件的search_term字段都对应了你要的内容 - 如果有些事件里没有这个SQL语句,可以加
| where isnotnull(search_term)过滤掉无效事件,避免统计结果被干扰
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

