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下安装步骤:1
2
3
4
5
6
7sudo 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建立连接
python21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import 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:即查询命令的集合,例如:
* | head 10``` 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22* saved search: 被保存的可以被再次使用的搜索查询。
* search job:即一次搜索操作的具体实例。
* Normal search: 异步搜索,能够立刻返回serach job而不用等到结果都搜索完。
* Blocking search:同步搜索,只有所有搜索全都完成后才返回job.
* Oneshot: blocking serach,直接返回搜索结果而不是返回job
...
### 创建一个blocking serach
与normal search的不同点是blocking search是堵塞的,也就是创建job后不会立刻返回,而是等待所有结果搜索结束后才返回,此时job包含了所有的搜索结果。
```python
# 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
normal search 是异步的,即立刻返回job, 但是实际结果并没有返回,因此会存在操作job时没有event返回的情况,我目前的做法是,如果知道大致的搜索时间,则设置一定时间等待后再对job进行操作。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import 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()
创建一个oneshot search
1 | import splunklib.results as results |
…待续