最近在公司实习用到了splunk,需要调用splunk sdk进行一些简单的开发,目前把我这个星期的一些体会记录下。
简单来说,Splunk是一个托管的日志文件管理工具,它的主要功能包括:
· 日志聚合功能
· 搜索功能
· 提取意义
· 对结果进行分组,联合,拆分和格式化
· 可视化功能
· 电子邮件提醒功能
而目前我通过splunk sdk主要实现的功能就是搜索功能,即搜索到我想要的日志。
通过Splunk SDK我们可以和Splunk引擎进行交互。Splunk SDK是基于REST API的,因此通过简短的代码实现我们想要的功能。
官方文档:http://dev.splunk.com/python
! 注意, splunk SDK 目前只支持python2,不支持python3.
Ubuntu下安装步骤:
sudo apt-get install python-pip //第一步:安装pip工具
pip freeze //查看是否已安装splunk sdk
pip install splunk-sdk //第二步:下载splunk sdk
export PYTHONPATH=~/splunk-sdk-python //添加到python环境变量
主要有4个模块:
* binding: 基于HTTP的抽象层
* client: 基于REST API的抽象层,其中Service类是其最重要的类,并且client模块比binding模块有更多的好处。
* results: 对splunk返回的数据进行处理
* data: 将Atom Feed data转换为python格式
目前我主要用到的模块是client和results模块。
python2
import splunklib.client as client
HOST = "localhost"
PORT = 8089
USERNAME = "admin"
PASSWORD = "changeme"
# Create a Service instance and log in
service = client.connect(
host=HOST,
port=PORT,
username=USERNAME,
password=PASSWORD)
# Print installed apps to the console to verify login
for app in service.apps:
print app.name
存在的问题:splunk服务器的8089没有打开,因此连接不上
解决:
splunk的服务器是在一个虚拟网络下的,8089端口不对公网开放,因此可以在该网络下另起一个ubuntu虚拟机,然后ubuntu虚拟机通过22端口与请求相连接,收到请求后,由于ubuntu和splunk server是在一个内网中,因此ubuntu虚拟机可以与splunk server的8089端口通信,获得数据后再返回给请求端。
search * | head 10
与normal search的不同点是blocking search是堵塞的,也就是创建job后不会立刻返回,而是等待所有结果搜索结束后才返回,此时job包含了所有的搜索结果。
# Get the collection of jobs
jobs = service.jobs
# Run a blocking search--search everything, return 1st 100 events
kwargs_blockingsearch = {"exec_mode": "blocking"}
searchquery_blocking = "search * | head 100"
print "Wait for the search to finish..."
# A blocking search returns the job's SID when the search is done
job = jobs.create(searchquery_blocking, **kwargs_blockingsearch)
print "...done!\n"
normal search 是异步的,即立刻返回job, 但是实际结果并没有返回,因此会存在操作job时没有event返回的情况,我目前的做法是,如果知道大致的搜索时间,则设置一定时间等待后再对job进行操作。
import splunklib.results as results
# Initialize your service like so
# import splunklib.client as client
# service = client.connect(username="admin", password="changeme")
searchquery_normal = "search * | head 10"
kwargs_normalsearch = {"exec_mode": "normal"}
job = service.jobs.create(searchquery_normal, **kwargs_normalsearch)
# Get the results and display them
for result in results.ResultsReader(job.results()):
print result
job.cancel()
import splunklib.results as results
# Run a one-shot search and display the results using the results reader
# Set the parameters for the search:
# - Search everything in a 24-hour time range starting June 19, 12:00pm
# - Display the first 10 results
kwargs_oneshot = {"earliest_time": "2014-06-19T12:00:00.000-07:00",
"latest_time": "2014-06-20T12:00:00.000-07:00"}
searchquery_oneshot = "search * | head 10"
oneshotsearch_results = service.jobs.oneshot(searchquery_oneshot, **kwargs_oneshot)
# Get the results and display them using the ResultsReader
reader = results.ResultsReader(oneshotsearch_results)
for item in reader:
print(item)
…待续