CairoPlot讓Linux服務器的日志文件更直觀
原創(chuàng)【51CTO精選譯文】確實有些Linux服務器管理員很享受閱讀及核對日志文件的艱辛過程,但為什么不創(chuàng)建一個美觀的列表及圖形體系來突出那些故障和問題,而非要受這份罪呢?試試這款優(yōu)秀的工具——CairoPlot吧,它會提供給你美觀且信息可視化的服務器日志文件分析途徑。
作為一個需要整天跟數(shù)據(jù)打交道的從業(yè)者,我一直致力于尋找更好的方法來將紛繁復雜的數(shù)據(jù)顯示為列表和圖形,尤其是利用Python來實現(xiàn)這一目標。時下存在很多利用Python制作的整合軟件包可供使用,但如果你希望輸出的結果不會因為粗糙的視覺效果而遭到那些蘋果使用者們的恥笑,那么我向你強力推薦CairoPlot。
CairoPlot并未像大多數(shù)發(fā)行版軟件那樣進行封包,但它的安裝過程依然簡便易行。目前在CairoPlot Launchpad page(CairoPlot官方主頁)上提供的***版本是1.1版。你可以在那里下載到cairoplot-1.1.tar.gz這個文件,或是根據(jù)你自己的喜好,從BZR上搜索(一旦1.2版本發(fā)布,CairoPlot項目可能會整體轉移到Sourceforge.net上)。
解壓壓縮包:
$ tar xvf cairoplot-1.1.tar.gz
然后復制下面這個文件:cairoplot-1.1/CairoPlot.py,并粘貼到你要開發(fā)的Python腳本所在的目錄下。
用扇形圖說明:誰在發(fā)送垃圾郵件?
展開測繪工作之前,找到一個良好的數(shù)據(jù)源永遠是我們的首要任務。針對這個項目,讓我們先來分析一個Postfix日志文件,/var/log/mail.info,借以觀察一系列垃圾郵件的眾多來源。
通過對文件的隨機檢查,我們會發(fā)現(xiàn)有許多提出接收請求的郵件都來自一個客觀上根本不存在的地址,舉例說明:
Mar 5 15:05:45 mailserver postfix/smtpd[29764]: NOQUEUE: reject: RCPT from 212.199.94.45.static.012.net.il[212.199.94.45]: 450 4.7.1 <ex02.maccabiworld.org>: Helo command rejected: Host not found; from=<> to=<aiglance@mydomain.com> proto=ESMTP helo=<ex02.maccabiworld.org>
我們的posifix服務器一般會拒絕這樣的郵件,因為通常情況下它們都是垃圾郵件。配置正確的郵件服務器應該不會編造這些虛假的地址——當然在有些配置有誤的服務器上是會發(fā)生這種狀況。
但是這些虛假的接收請求從何而來?他們是否來自特定的一些國家?而在這些特定國家的垃圾郵件來源中,存在多少.com類型網(wǎng)站,又有多少.net類型網(wǎng)站?
為了找到答案,我將創(chuàng)建一個Python索引系統(tǒng),然后使用CairoPlot工具來測繪出一幅扇形圖。索引中的每個關鍵字都將涵蓋一個***域,例如“.com”;而其數(shù)值則為從該類型域中發(fā)來的被拒收郵件的數(shù)量。
剖析日志文件
要填充索引系統(tǒng)中的詞條項目,意味著我們需要對/var/log/mail.info文件進行剖析。每封郵件的真正發(fā)出地址能夠從RCPT中查詢到;將結果應用到Python的re模塊中。因為這一過程是針對CairoPlot的,因此我們不必遵循Python的描述方式,只需按照以下代碼的形式表達:
#! /usr/bin/env python import CairoPlot, re MAIL_INFO = "/var/log/mail.info" # Dictionary to store the results as (domain : number of rejects) rejected = {} # Parse mail.info to find all the 'NOQUEUE: reject' lines and # figure out what top-level domains (TLDs) they're coming from. f = open(MAIL_INFO) for line in f : if line.find('status=sent') > 0 : pass elif line.find('NOQUEUE: reject') > 0 : # An attempt we rejected. Look for a pattern like # RCPT from foo.example.com[nnn.nnn.nnn.nnn] rcpt = re.search("RCPT from ([^[]*)\[([0-9\.]+)\]", line) if not rcpt : continue # Now rcpt.group(1) is the reverse-DNS hostname (if any) # from the log file, rcpt.group(2) is the IP address. if rcpt.group(1) and rcpt.group(1) != 'unknown' : hostname = rcpt.group(1) else : hostname = None # Find the part after the last "." tld = "Unknown" # default there's no "." in the hostname if hostname : dot = hostname.rfind(".") if dot >= 0 : tld = hostname[dot+1:] if tld in rejected : # We've seen this TLD before; add 1. rejected[tld] += 1 else : # First time we've seen this TLD. rejected[tld] = 1 f.close()
在結尾部分,通過以下內容將索引系統(tǒng)中的“拒收”標準傳達給CairoPlot。
{'ru': 3, 'ch': 1, 'ma': 2, 'rs': 2, 'it': 4, 'hu': 1, 'cz': 1, 'ar': 2, 'il': 35, 'br': 16, 'es': 1, 'co': 2, 'net': 4, 'com': 24, 'pl': 7, 'at': 2}
#p#
創(chuàng)建扇形圖
你要如何依據(jù)索引系統(tǒng)來創(chuàng)建一個扇形圖?事實上一行命令即可實現(xiàn):
CairoPlot.pie_plot("piechart", rejected, 500, 500, None, True, False, None)
CairoPlot將生成一個名為pie.svg的圖形文件(如圖一所示)。
圖一
其參數(shù)為:
pie_plot(name, data, width, height, background=None, gradient=False, shadow=False, colors=None)
Name(名稱)指文件名:如果你希望加入一個諸如.jpg之類的擴展名,那么CairoPlot將使用你所設定的格式來取代svg格式,因為在某些情況下你可能會需要一個IE用戶能夠通過頁面正常瀏覽的圖像。
Data(數(shù)據(jù)),當然了,代表索引系統(tǒng)中的數(shù)值。
Width(寬度)和Height(高度)代表你所希望的圖形繪制尺寸。需要注意的是,CairoPlot預留給扇形圖周邊的空白區(qū)域是相當有限的,所以一定要注意整體規(guī)劃。
Background(背景),你需要指定一種背景顏色,其選色方法為標準的RGB形式。因此,通過background=(0,1,0)這一指令,你將獲得一個全綠的背景。你在這里也可以使用Cairo gradient(色階)來進行設定。Gradient(色階)功能可以讓你選擇是否將你扇形圖中的某一塊顯示出色彩漸變的效果,以使整個圖形更加美觀。Shadow(陰影)功能將讓你可以為整個扇形圖增加底部陰影效果,并且如果你不喜歡系統(tǒng)默認的陰影顏色,也可以隨意為其定義新的顏色。當然,陰影顏色同樣即可以是單色也可以包含色階。需要強調的是,所選顏色的數(shù)量必須與索引系統(tǒng)中的項目數(shù)量相同。
圖一中的示例存在一個小問題:它顯示絕大多數(shù)無效的接收請求來自根本無法解析的服務器地址,而表示狀況的圖形被壓成極細小的一塊,根本無法解讀。而且顯然你從那一大塊“無法解析“的服務器來源中根本折騰不出什么有用的信息。在這種情況下,你可以在指令中if hostname:后面添加如下內容
if hostname : dot = hostname.rfind(".") if dot >= 0 : ext = hostname[dot+1:] else : continue
運行上述命令,這時扇形圖變?yōu)槿鐖D二所示。很有意思吧。直到編寫這個實例,我才意識到相比起其它國家,我從以色列和巴西收到了這么多的垃圾郵件。有時候一幅清晰的示意圖絕對勝過千言萬語。
圖二
#p#
條形圖
CairoPlot也可以制作出很棒的條形圖。但遺憾的是,CairoPlot的各種規(guī)則不太適合條形圖數(shù)據(jù)的導入。條形圖需要的是列表,而非索引。
這都不叫事兒!只要把上文中的索引系統(tǒng)轉換為兩個列表——一個包含標簽信息,一個包含具體數(shù)據(jù)——再進行條形圖繪制(如圖三所示):
h_labels = [ k for k in rejected.keys() ]
rejlist = [ rejected[k] for k in rejected.keys() ]
CairoPlot.bar_plot ('bars', rejlist, 500, 400,
border=5, three_dimension=True,
h_labels=h_labels)
圖三
同制作扇形圖一樣,你可以導入一個顏色列表來使用自定義顏色,而且還有其它一些諸如背景、風格、圓滑邊角、沙盤模型高度、象限體積以及必然具備的標簽體積和標簽高度等調節(jié)選項。
當然,CairoPlot同樣可以制作其它類型的圖形。這有一些實例文檔,你也可以使用Python的交互式解析工具并輸入如下內容:
import CairoPlot help(CairoPlot.pie_plot)
CairoPlot站點將很可能遷移至Sourceforge網(wǎng)站,并提供更加完備的訪問頁面。與此同時,如果你已經(jīng)有過一些實踐經(jīng)驗,你一定會深切體會到CairoPlot在制作美觀艷麗的圖形方面絕對稱得上是***工具之一。
原文地址:http://www.linuxplanet.com/linuxplanet/tutorials/7317/1/
【51CTO.com譯文,轉載請注明原文作譯者和出處。】
【編輯推薦】