2016-03-09 9 views
6

splunklib.resultsモジュールまたはsplunklibモジュールでSplunk検索中に発生したエラーの数を取得する方法はありますか?以下は 戻り値PythonでのSplunk検索からのエラー数

は、これまでの私のコードです:

#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() 

I上記のコードでは、次のエラーが出ます:

'OrderedDict' object has no attribute 'messages'

+2

ハハハホスト= "8.8.8.8"。それはGoogleのDNSサーバーです;-) –

答えて

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 

あなたはデータで問題が発生する可能性があり.load()には単一のルートノードを持つXMLが必要です。あなたはつまり、あなたのフィードを、ラップこれを回避することができます1つの飼料中の複数の結果のノードがある場合:あなたの代わりにデータオブジェクトの生のフィードへのアクセスを持っている場合、あなたはlxmlのを使用することができ"<root>+open("feed.xml").read()</root>"

のSplunkのlibのinsted

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

以下は、splunklibのドキュメントに基づく完全な例です。 ResultsReaderは原子フィードを解析し、それぞれの結果に対してdata.load()を呼び出します。

 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

私の 'feed.xml'文書はどこにありますか? – pHorseSpec

+0

完全な例を追加しました...クライアントのドキュメントで異なる 'client.connect()'パラメータを確認してください。あなたのXMLは、ジョブから残りのAPIを介して取得されます。新しいジョブを作成するか(例1のように)、 'sid'を使って' client.job() 'メソッドでスケジュールされたジョブを取得します。 – xvan

+0

それ以外の場合、スケジューリングされたジョブは、その結果をSplunkサーバー上のxmlファイルに保存することができます。その後、あなたはそれにアクセスすることができます。 – xvan