背景:最近在做日志分析相关开发,需要通过SDK对接splunk,拿到其中符合条件的syslog作进一步分析,但是在用splunk官方的SDK创建搜索并获取结果后发现,接口上获取到的数据相比于界面上搜索的内容多了一些内置字段,但是没办法看到界面上从事件中解析出来的字段并进行相应操作,这样导致只能拿到_raw字段中的原始日志进行分析,不能达到预期效果,于是翻阅了splunk接口文档以及rest api说明,通过参数调整能够拿到对应事件所有的字段(包括splunk默认字段及自动从事件中解析出的字段,还有自定义提取的字段),demo如下所示。
# pip install splunk-sdk
import splunklib.client as client
import splunklib.results as results
# splunk连接配置
connect_config = {
"scheme": "https",
"host": "192.168.100.10",
"port": 8089,
"autologin": True,
"username": "admin",
"password": "P@ssw0rd"
}
"""
splunk搜索配置,其中exec_mode为blocking表示阻塞获取,即等待查询完成后再接收返回的job对象
rf是指此次查询所需要的字段,具体参照splunk rest api中search/jobs的post参数说明[https://docs.splunk.com/Documentation/Splunk/8.2.6/RESTREF/RESTsearch#search.2Fjobs]
tips:在splunk中,如非特殊指定某索引的默认字段,则默认返回 host, source和source type这三个字段(以及其他内置字段),详见字段说明[https://docs.splunk.com/Documentation/Splunk/8.2.6/Search/Usefieldstoretrieveevents]
至于事件(splunk中的某一条数据可以理解为一个事件)中解析出来的字段,则不会在api接口中显式地返回(页面上也是通过选择字段实现额外展示),
而在创建job时若在rf参数中指定了"*",则表示此次查询返回默认字段、事件中解析出来的字段以及事先提取的自定义字段(提取字段时需要设置好该字段的用户权限及应用范围),
若不显式设置,只返回默认字段及其他内置字段
"""
splunk_search_kwargs = {"exec_mode": "blocking", "rf":"*"}
# 创建splunk连接
splunk_client = client.connect(**connect_config)
# 构造splunk搜索语句
search_query_blocking = "search index=syslog | head 2"
# 创建搜索job
splunk_search_job = splunk_client.jobs.create(search_query_blocking, **splunk_search_kwargs)
"""
接收返回的结果,其中splunk_search_job.results(output_mode="json", f="*")的output_mode设为json是为了
将job的结果以json格式输出,然后用results库中的JSONResultsReader解析出来,
而f参数是指拿取结果时,要提取哪些在rf中指定的字段返回,默认是全部返回,若指定则用逗号分隔,详见search/jobs/{search_id}/results说明[https://docs.splunk.com/Documentation/Splunk/8.2.6/RESTREF/RESTsearch#:~:text=search_id%7D%20search%20events.-,search/jobs/%7Bsearch_id%7D/results,-https%3A//%3Chost%3E%3A%3CmPort]
"""
results = results.JSONResultsReader(splunk_search_job.results(output_mode="json", f="*"))
for result in results:
print(result)