Splunk-SDK-Python学习

Splunk

最近在公司实习用到了splunk,需要调用splunk sdk进行一些简单的开发,目前把我这个星期的一些体会记录下。

什么是splunk

简单来说,Splunk是一个托管的日志文件管理工具,它的主要功能包括:
· 日志聚合功能
· 搜索功能
· 提取意义
· 对结果进行分组,联合,拆分和格式化
· 可视化功能
· 电子邮件提醒功能
而目前我通过splunk sdk主要实现的功能就是搜索功能,即搜索到我想要的日志。

Splunk SDK for Python

通过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模块。

与Splunk enterprise建立连接

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的一些术语

  • search query:即查询命令的集合,例如:search * | head 10
  • saved search: 被保存的可以被再次使用的搜索查询。
  • search job:即一次搜索操作的具体实例。
  • Normal search: 异步搜索,能够立刻返回serach job而不用等到结果都搜索完。
  • Blocking search:同步搜索,只有所有搜索全都完成后才返回job.
  • Oneshot: blocking serach,直接返回搜索结果而不是返回job

创建一个blocking serach

与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)

…待续

你可能感兴趣的:(Python,splunk)