2016-03-25 19 views
1

以下のようなsyslogがあります。pyparsingでsyslogメッセージを解析する方法

日= 2015年10月8日、時間= 16:03:26 devnameを= D1_FIG DEVICE_ID = ID300B3908601UID LOG_ID = 0021000002タイプ=トラフィックのサブタイプ=許可PRI =通知VD =ルートSRC = 157.56.15.15 src_port = 3584 src_int =」 port4 "dst = 211.16.12.55 dst_port = 80 dst_int =" WLN_200 "SN = 2775431942 status = accept policyid = 430 dst_country ="英国、英国 "src_country ="英国、英国 "dir_disp = org tran_disp = dnat tran_ip = 12.15.7.17 tran_port = 80 service = HTTPプロトコル= 6 duration = 120 sent = 132 rcvd = 92 sent_pkt = 3 rcvd_pkt = 2

このようなpyparsingを使用してこのログを解析します。

{"date", "2015-10-08"} 
{"time", "16:03:26"} 
{"devname", "D1_FIG"} 
{"device_id", "ID300B3908601UID"} 
.... 
{"src", "157.56.15.15"} 
.... 
{"dst_country", "United Kingdom, Great Britain"} 
.... 

ソースコードはこのようです。

from pyparsing import * 

origin_str = "date=2015-10-08 time=16:03:26 devname=D1_FIG device_id=ID300B3908601UID log_id=0021000002 type=traffic subtype=allowed pri=notice vd=root src=157.56.15.15 src_port=3584 src_int=\"port4\" dst=211.16.12.55 dst_port=80 dst_int=\"WLN_200\" SN=2775431942 status=accept policyid=430 dst_country=\"United Kingdom, Great Britain\" src_country=\"United Kingdom, Great Britain\" dir_disp=org tran_disp=dnat tran_ip=12.15.7.17 tran_port=80 service=HTTP proto=6 duration=120 sent=132 rcvd=92 sent_pkt=3 rcvd_pkt=2" 

date_s = Word(nums, nums+'-') 
time_s = Word(nums, nums+':') 
identifier = Word(alphas, alphanums+'_') | date_s | time_s 
equal = Literal("=").suppress() 
KeyNValue = identifier.setResultsName("lhs") + equal + identifier.setResultsName("rhs") 

for srvrtokens,startloc,endloc in KeyNValue.scanString(origin_str): 
    print srvrtokens 

これは私がこれまで持っているものです。

['date', '2015-10-08'] 
['time', '16'] 
['devname', 'FW_IDC1'] 
['device_id', 'FG300B3908601477'] 
['log_id', '0021000002'] 
['type', 'traffic'] 
['subtype', 'allowed'] 
['pri', 'notice'] 
['vd', 'root'] 
['src', '147'] 
['src_port', '58979'] 
['dst', '210'] 
['dst_port', '80'] 
['SN', '2770251942'] 
['status', 'accept'] 
['policyid', '430'] 
['dir_disp', 'org'] 
['tran_disp', 'dnat'] 
['tran_ip', '172'] 
['tran_port', '80'] 
['service', 'HTTP'] 
['proto', '6'] 
['duration', '120'] 
['sent', '132'] 
['rcvd', '92'] 
['sent_pkt', '3'] 
['rcvd_pkt', '2'] 

しかし、私は「時間」と「dst_country」文字列を解析する方法がわかりません。

+0

があなたの所望の出力はかなり 'dict'または' list'ではありません。あなたの望む結果の形はどういうものですか? –

+0

どちらでもかまいません。私の問題は解析中です。あなたの答えは私の問題を解決することです! – appdid

答えて

1

このプログラムは、ログ文字列にデータのdictを生成します。

from pyparsing import * 
from pprint import pprint 

origin_str = "date=2015-10-08 time=16:03:26 devname=D1_FIG device_id=ID300B3908601UID log_id=0021000002 type=traffic subtype=allowed pri=notice vd=root src=157.56.15.15 src_port=3584 src_int=\"port4\" dst=211.16.12.55 dst_port=80 dst_int=\"WLN_200\" SN=2775431942 status=accept policyid=430 dst_country=\"United Kingdom, Great Britain\" src_country=\"United Kingdom, Great Britain\" dir_disp=org tran_disp=dnat tran_ip=12.15.7.17 tran_port=80 service=HTTP proto=6 duration=120 sent=132 rcvd=92 sent_pkt=3 rcvd_pkt=2" 

key = Word(alphas, alphanums+'_') 
value = quotedString | Word(printables) 
equal = Literal("=").suppress() 
KeyNValue = key + equal + value 

result = dict(srvtokens for srvtokens,_,_ in KeyNValue.scanString(origin_str)) 
assert len(result) == origin_str.count('=') 

pprint(result) 

結果:

{'SN': '2775431942', 
'date': '2015-10-08', 
'device_id': 'ID300B3908601UID', 
'devname': 'D1_FIG', 
'dir_disp': 'org', 
'dst': '211.16.12.55', 
'dst_country': '"United Kingdom, Great Britain"', 
'dst_int': '"WLN_200"', 
'dst_port': '80', 
'duration': '120', 
'log_id': '0021000002', 
'policyid': '430', 
'pri': 'notice', 
'proto': '6', 
'rcvd': '92', 
'rcvd_pkt': '2', 
'sent': '132', 
'sent_pkt': '3', 
'service': 'HTTP', 
'src': '157.56.15.15', 
'src_country': '"United Kingdom, Great Britain"', 
'src_int': '"port4"', 
'src_port': '3584', 
'status': 'accept', 
'subtype': 'allowed', 
'time': '16:03:26', 
'tran_disp': 'dnat', 
'tran_ip': '12.15.7.17', 
'tran_port': '80', 
'type': 'traffic', 
'vd': 'root'} 
+0

時々、解析された構造と必要な構造との間の切り離しは、この種の解析後の構造構築を強制します。しかし、この場合、Dictクラスを使用して、解析時にpictarsを構築することができます: 'result = Dict(OneOrMore(Group(KeyNValue))。parseString(origin_str).asDict()'。 OPは、文字列の代わりに実際のint、浮動小数点数、日付時刻などを与えるために、型固有の形式と解析時変換器を構文解析アクションとして追加して値をより識別しやすくすることもできます。しかし、それらはすべて読者のための良いフォローアップ練習です。いい答え! – PaulMcG

+0

完璧な答え。ロブ。 KeyNValue.scanString(origin_str)の "srvtokens、_、_のsrvtokensについて"私に説明しますか?ポールの答えもいいです! – appdid

関連する問題