2016-03-09 14 views
6

Có cách nào để nhận được số lỗi xảy ra trong khi tìm kiếm Splunk với mô-đun splunklib.results hoặc bất kỳ mô-đun splunklib nào không?Trả về số lỗi từ tìm kiếm Splunk trong Python

Dưới đây, là mã của tôi cho đến nay:

#purpose of script: To connect to Splunk, execute a query, and write the query results out to an excel file. 
#query results = multiple dynamiC# of rows. 7 columns. 

#!/usr/bin/env python 
import splunklib.client as client #splunklib.client class is used to connect to splunk, authenticate, and maintain session 
import splunklib.results as results #module for returning results and printing/writing them out 

listOfAppIDs = [] 
#open file to read each line and add each line in file to an array. These are our appID's to search 
with open('filelocation.txt', 'r') as fi: 
    for line in fi: 
     listOfAppIDs.append(line.rstrip('\n')) 
print listOfAppIDs 

#identify variables used to log in 
HOST = "8.8.8.8" 
PORT = 8089 
USERNAME = "uName" 
PASSWORD = "pWord" 

startPoint = "appID1" #initial start point in array 

outputCsv = open('filelocation.csv', 'wb') 
fieldnames = ['Application ID', 'transport', 'dst_port', 'Average Throughput per Month','Total Sessions Allowed', 'Unique Source IPs', 'Unique Destination IPs'] 
writer = csv.DictWriter(outputCsv, fieldnames=fieldnames) 
writer.writeheader(); 

def connect(): 
    global startPoint , item 
    print "startPoint: " + startPoint 

    #Create a service instance by using the connect function and log in 
    service = client.connect(
     host=HOST, 
     port=PORT, 
     username=USERNAME, 
     password=PASSWORD, 
     autologin=True 
    ) 
    jobs = service.jobs# Get the collection of jobs/searches 
    kwargs_blockingsearch = {"exec_mode": "normal"} 

    try: 
     for item in listOfAppIDs: 
      errorCount=0 
      print "item: " + item 
      if (item >= startPoint):  
       searchquery_blocking = "search splunkQery" 
       print item + ':' 
       job = jobs.create(searchquery_blocking, **kwargs_blockingsearch) # A blocking search returns query result. Search executes here 
       print "Splunk query for appID " , item , " completed! \n" 
       resultCount = job["resultCount"] #number of results this job (splunk query) returned 
       print "result count " , resultCount 
       rr = results.ResultsReader(job.results()) 
       for result in rr: 
        if isinstance(result, results.Message): 
         # Diagnostic messages may be returned in the results 
         # Check the type and do something. 
         if result.type == log_type: 
          print '%s: %s' % (result.type, result.message) 
          errorCount+=1 
        elif isinstance(result, dict): 
         # Normal events are returned as dicts 
         # Do something with them if required. 
         print result 
         writer.writerow([result + errorCount]) 
         pass 
       assert rr.is_preview == False 
    except: 
     print "\nexcept\n" 
     startPoint = item #returh to connect function but start where startPoint is at in array 
     connect() 

    print "done!"  

connect() 

tôi nhận được lỗi sau với đoạn code trên:

'OrderedDict' object has no attribute 'messages'

+2

Hahaha HOST = "8.8.8.8". Đó là máy chủ DNS của google ;-) –

Trả lời

3
from splunklib import results 
my_feed=results.ResultsReader(open("results.xml")) 

log_type='ERROR' 

n_errors=0 
for result in my_feed.results: 
    if isinstance(result, results.Message): 
     if result.type==log_type: 
      print result.message 
      n_errors+=1 

Bạn có thể có vấn đề với dữ liệu .load() vì nó yêu cầu một xml với một nút gốc duy nhất. Nếu bạn có kết quả nhiều nút trong một thức ăn có thể làm việc xung quanh này gói thức ăn của bạn, ví dụ: "<root>+open("feed.xml").read()</root>"

Nếu bạn có quyền truy cập vào các thức ăn thô thay vì một đối tượng dữ liệu, bạn có thể sử dụng lxml insted của Splunk lib

len(lxml.etree.parse("results.xml").findall("//messages/msg[@type='ERROR']")) 

Sau đây là ví dụ hoàn chỉnh dựa trên tài liệu splunklib. ResultsReader phân tích cú pháp nguồn cấp dữ liệu nguyên tử và gọi số data.load() trên mỗi kết quả cho bạn.

 import splunklib.client as client 
     import splunklib.results as results 
     from time import sleep 

     log_type='ERROR' 

     service = client.connect(...) 
     job = service.jobs.create("search * | head 5") 
     while not job.is_done(): 
      sleep(.2) 
     rr = results.ResultsReader(job.results()) 
     for result in rr: 
      if isinstance(result, results.Message): 
       # Diagnostic messages may be returned in the results 
       # Check the type and do something. 
       if result.type == log_type: 
       print '%s: %s' % (result.type, result.message) 
      elif isinstance(result, dict): 
       # Normal events are returned as dicts 
       # Do something with them if required. 
       pass 
     assert rr.is_preview == False 
+0

nơi tôi có thể tìm thấy tài liệu 'feed.xml' của mình? – pHorseSpec

+0

Thêm một ví dụ đầy đủ ... Kiểm tra tài liệu của khách hàng cho các tham số 'client.connect()' khác nhau. Xml của bạn được lấy thông qua phần còn lại api từ một công việc ... Hoặc tạo một công việc mới (ví dụ như một ví dụ), hoặc lấy một công việc theo lịch trình thông qua 'sid' với phương thức' client.job() '. – xvan

+0

Nếu không, một công việc theo lịch có thể lưu trữ kết quả của nó trên một tệp xml trên máy chủ tách. Sau đó, bạn có thể truy cập trực tiếp nó. – xvan

Các vấn đề liên quan