CairoPlot讓Linux服務(wù)器的日志文件更直觀
原創(chuàng)【51CTO精選譯文】確實(shí)有些Linux服務(wù)器管理員很享受閱讀及核對(duì)日志文件的艱辛過(guò)程,但為什么不創(chuàng)建一個(gè)美觀的列表及圖形體系來(lái)突出那些故障和問(wèn)題,而非要受這份罪呢?試試這款優(yōu)秀的工具——CairoPlot吧,它會(huì)提供給你美觀且信息可視化的服務(wù)器日志文件分析途徑。
作為一個(gè)需要整天跟數(shù)據(jù)打交道的從業(yè)者,我一直致力于尋找更好的方法來(lái)將紛繁復(fù)雜的數(shù)據(jù)顯示為列表和圖形,尤其是利用Python來(lái)實(shí)現(xiàn)這一目標(biāo)。時(shí)下存在很多利用Python制作的整合軟件包可供使用,但如果你希望輸出的結(jié)果不會(huì)因?yàn)榇植诘囊曈X(jué)效果而遭到那些蘋(píng)果使用者們的恥笑,那么我向你強(qiáng)力推薦CairoPlot。
CairoPlot并未像大多數(shù)發(fā)行版軟件那樣進(jìn)行封包,但它的安裝過(guò)程依然簡(jiǎn)便易行。目前在CairoPlot Launchpad page(CairoPlot官方主頁(yè))上提供的***版本是1.1版。你可以在那里下載到cairoplot-1.1.tar.gz這個(gè)文件,或是根據(jù)你自己的喜好,從BZR上搜索(一旦1.2版本發(fā)布,CairoPlot項(xiàng)目可能會(huì)整體轉(zhuǎn)移到Sourceforge.net上)。
解壓壓縮包:
$ tar xvf cairoplot-1.1.tar.gz
然后復(fù)制下面這個(gè)文件:cairoplot-1.1/CairoPlot.py,并粘貼到你要開(kāi)發(fā)的Python腳本所在的目錄下。
用扇形圖說(shuō)明:誰(shuí)在發(fā)送垃圾郵件?
展開(kāi)測(cè)繪工作之前,找到一個(gè)良好的數(shù)據(jù)源永遠(yuǎn)是我們的首要任務(wù)。針對(duì)這個(gè)項(xiàng)目,讓我們先來(lái)分析一個(gè)Postfix日志文件,/var/log/mail.info,借以觀察一系列垃圾郵件的眾多來(lái)源。
通過(guò)對(duì)文件的隨機(jī)檢查,我們會(huì)發(fā)現(xiàn)有許多提出接收請(qǐng)求的郵件都來(lái)自一個(gè)客觀上根本不存在的地址,舉例說(shuō)明:
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服務(wù)器一般會(huì)拒絕這樣的郵件,因?yàn)橥ǔG闆r下它們都是垃圾郵件。配置正確的郵件服務(wù)器應(yīng)該不會(huì)編造這些虛假的地址——當(dāng)然在有些配置有誤的服務(wù)器上是會(huì)發(fā)生這種狀況。
但是這些虛假的接收請(qǐng)求從何而來(lái)?他們是否來(lái)自特定的一些國(guó)家?而在這些特定國(guó)家的垃圾郵件來(lái)源中,存在多少.com類型網(wǎng)站,又有多少.net類型網(wǎng)站?
為了找到答案,我將創(chuàng)建一個(gè)Python索引系統(tǒng),然后使用CairoPlot工具來(lái)測(cè)繪出一幅扇形圖。索引中的每個(gè)關(guān)鍵字都將涵蓋一個(gè)***域,例如“.com”;而其數(shù)值則為從該類型域中發(fā)來(lái)的被拒收郵件的數(shù)量。
剖析日志文件
要填充索引系統(tǒng)中的詞條項(xiàng)目,意味著我們需要對(duì)/var/log/mail.info文件進(jìn)行剖析。每封郵件的真正發(fā)出地址能夠從RCPT中查詢到;將結(jié)果應(yīng)用到Python的re模塊中。因?yàn)檫@一過(guò)程是針對(duì)CairoPlot的,因此我們不必遵循Python的描述方式,只需按照以下代碼的形式表達(dá):
#! /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()
在結(jié)尾部分,通過(guò)以下內(nèi)容將索引系統(tǒng)中的“拒收”標(biāo)準(zhǔn)傳達(dá)給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)來(lái)創(chuàng)建一個(gè)扇形圖?事實(shí)上一行命令即可實(shí)現(xiàn):
CairoPlot.pie_plot("piechart", rejected, 500, 500, None, True, False, None)
CairoPlot將生成一個(gè)名為pie.svg的圖形文件(如圖一所示)。
圖一
其參數(shù)為:
pie_plot(name, data, width, height, background=None, gradient=False, shadow=False, colors=None)
Name(名稱)指文件名:如果你希望加入一個(gè)諸如.jpg之類的擴(kuò)展名,那么CairoPlot將使用你所設(shè)定的格式來(lái)取代svg格式,因?yàn)樵谀承┣闆r下你可能會(huì)需要一個(gè)IE用戶能夠通過(guò)頁(yè)面正常瀏覽的圖像。
Data(數(shù)據(jù)),當(dāng)然了,代表索引系統(tǒng)中的數(shù)值。
Width(寬度)和Height(高度)代表你所希望的圖形繪制尺寸。需要注意的是,CairoPlot預(yù)留給扇形圖周邊的空白區(qū)域是相當(dāng)有限的,所以一定要注意整體規(guī)劃。
Background(背景),你需要指定一種背景顏色,其選色方法為標(biāo)準(zhǔn)的RGB形式。因此,通過(guò)background=(0,1,0)這一指令,你將獲得一個(gè)全綠的背景。你在這里也可以使用Cairo gradient(色階)來(lái)進(jìn)行設(shè)定。Gradient(色階)功能可以讓你選擇是否將你扇形圖中的某一塊顯示出色彩漸變的效果,以使整個(gè)圖形更加美觀。Shadow(陰影)功能將讓你可以為整個(gè)扇形圖增加底部陰影效果,并且如果你不喜歡系統(tǒng)默認(rèn)的陰影顏色,也可以隨意為其定義新的顏色。當(dāng)然,陰影顏色同樣即可以是單色也可以包含色階。需要強(qiáng)調(diào)的是,所選顏色的數(shù)量必須與索引系統(tǒng)中的項(xiàng)目數(shù)量相同。
圖一中的示例存在一個(gè)小問(wèn)題:它顯示絕大多數(shù)無(wú)效的接收請(qǐng)求來(lái)自根本無(wú)法解析的服務(wù)器地址,而表示狀況的圖形被壓成極細(xì)小的一塊,根本無(wú)法解讀。而且顯然你從那一大塊“無(wú)法解析“的服務(wù)器來(lái)源中根本折騰不出什么有用的信息。在這種情況下,你可以在指令中if hostname:后面添加如下內(nèi)容
if hostname : dot = hostname.rfind(".") if dot >= 0 : ext = hostname[dot+1:] else : continue
運(yùn)行上述命令,這時(shí)扇形圖變?yōu)槿鐖D二所示。很有意思吧。直到編寫(xiě)這個(gè)實(shí)例,我才意識(shí)到相比起其它國(guó)家,我從以色列和巴西收到了這么多的垃圾郵件。有時(shí)候一幅清晰的示意圖絕對(duì)勝過(guò)千言萬(wàn)語(yǔ)。
圖二
#p#
條形圖
CairoPlot也可以制作出很棒的條形圖。但遺憾的是,CairoPlot的各種規(guī)則不太適合條形圖數(shù)據(jù)的導(dǎo)入。條形圖需要的是列表,而非索引。
這都不叫事兒!只要把上文中的索引系統(tǒng)轉(zhuǎn)換為兩個(gè)列表——一個(gè)包含標(biāo)簽信息,一個(gè)包含具體數(shù)據(jù)——再進(jìn)行條形圖繪制(如圖三所示):
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)
圖三
同制作扇形圖一樣,你可以導(dǎo)入一個(gè)顏色列表來(lái)使用自定義顏色,而且還有其它一些諸如背景、風(fēng)格、圓滑邊角、沙盤(pán)模型高度、象限體積以及必然具備的標(biāo)簽體積和標(biāo)簽高度等調(diào)節(jié)選項(xiàng)。
當(dāng)然,CairoPlot同樣可以制作其它類型的圖形。這有一些實(shí)例文檔,你也可以使用Python的交互式解析工具并輸入如下內(nèi)容:
import CairoPlot help(CairoPlot.pie_plot)
CairoPlot站點(diǎn)將很可能遷移至Sourceforge網(wǎng)站,并提供更加完備的訪問(wèn)頁(yè)面。與此同時(shí),如果你已經(jīng)有過(guò)一些實(shí)踐經(jīng)驗(yàn),你一定會(huì)深切體會(huì)到CairoPlot在制作美觀艷麗的圖形方面絕對(duì)稱得上是***工具之一。
原文地址:http://www.linuxplanet.com/linuxplanet/tutorials/7317/1/
【51CTO.com譯文,轉(zhuǎn)載請(qǐng)注明原文作譯者和出處。】
【編輯推薦】