這里有一些技巧來處理日志文件提取。假設我們正在查看一些Enterprise Splunk提取。我們可以用Splunk來探索數(shù)據(jù)。或者我們可以得到一個簡單的提取并在Python中擺弄這些數(shù)據(jù)。
在Python中運行不同的實驗似乎比試圖在Splunk中進行這種探索性的操作更有效。主要是因為我們可以無所限制地對數(shù)據(jù)做任何事。我們可以在一個地方創(chuàng)建非常復雜的統(tǒng)計模型。
理論上,我們可以在Splunk中做很多的探索。它有各種報告和分析功能。
但是...
使用Splunk需要假設我們知道我們正在尋找什么。在很多情況下,我們不知道我們在尋找什么:我們正在探索。可能會有一些跡象表明,一些RESTful API處理速度很慢,但還不止于此。我們如何繼續(xù)?
第一步是獲取CSV格式的原始數(shù)據(jù)。怎么辦?
讀取原始數(shù)據(jù)
我們將首先用一些附加函數(shù)來包裝一個CSV.DictReader對象。
面向對象的純粹主義者會反對這個策略。 “為什么不擴展DictReader?”他們問。我沒有一個很好的答案。我傾向于函數(shù)式編程和組件的正交性。對于一個純粹的面向對象的方法,我們不得不使用更復雜的混合來實現(xiàn)這一點。
我們處理日志的一般框架是這樣的。
with open("somefile.csv") as source:rdr = csv.DictReader(source)這使我們可以讀取CSV格式的Splunk提取物。我們可以迭代閱讀器中的行。這是訣竅#1。這不是 非常 棘手,但我喜歡它。
with open("somefile.csv") as source:rdr = csv.DictReader(source)for row in rdr:print( "{host} {ResponseTime} {source} {Service}".format_map(row) )我們可以 - 在一定程度上 - 以有用的格式報告原始數(shù)據(jù)。如果我們想粉飾一下輸出,我們可以改變格式字符串。那就可能是“{主機:30s} {回復時間:8s} {來源:s}”或類似的東西。
過濾
常見的情況是我們提取了太多,但其實只需要看一個子集。我們可以更改Splunk過濾器,但是,在完成我們的探索之前,過量使用過濾器令人討厭。在Python中過濾要容易得多。一旦我們了解到需要什么,就可以在Splunk中完成。
with open("somefile.csv") as source:rdr = csv.DictReader(source)rdr_perf_log = (row for row in rdr if row['source'] == 'perf_log')for row in rdr_perf_log:print( "{host} {ResponseTime} {Service}".format_map(row) )我們已經加入了一個生成器表達式來過濾源行,能夠處理一個有意義的子集。
投影
在某些情況下,我們會添加額外的源數(shù)據(jù)列,這些列我們并不想使用。所以將通過對每一行進行投影來消除這些數(shù)據(jù)。
原則上,Splunk從不產生空列。但是,RESTful API日志可能會導致數(shù)據(jù)集中包含大量列標題,這些列標題是基于請求URI一部分的代理鍵。這些列將包含來自使用該代理鍵的一個請求的一行數(shù)據(jù)。對于其他行,在這一列中沒有任何用處。所以要刪除這些空列。
新聞熱點
疑難解答