CairoPlot 让 Linux 服务器的日志文件更直观
| 2011-03-23 14:06
确实有些Linux服务器管理员很享受阅读及核对日志文件的艰辛过程,但为什么不创建一个美观的列表及图形体系来突出那些故障和问题,而非要受这份罪呢?试试这款优秀的工具——CairoPlot吧,它会提供给你美观且信息可视化的服务器日志文件分析途径。
作为一个需要整天跟数据打交道的从业者,我一直致力于寻找更好的方法来将纷繁复杂的数据显示为列表和图形,尤其是利用Python来实现这一目标。时下存在很多利用Python制作的整合软件包可供使用,但如果你希望输出的结果不会因为粗糙的视觉效果而遭到那些苹果使用者们的耻笑,那么我向你强力推荐CairoPlot。
CairoPlot并未像大多数发行版软件那样进行封包,但它的安装过程依然简便易行。目前在CairoPlot Launchpad page(CairoPlot官方主页)上提供的最新版本是1.1版。你可以在那里下载到cairoplot-1.1.tar.gz这个文件,或是根据你自己的喜好,从BZR上搜索(一旦1.2版本发布,CairoPlot项目可能会整体转移到Sourceforge.net上)。
解压压缩包:
- $ tar xvf cairoplot-1.1.tar.gz
然后复制下面这个文件:cairoplot-1.1/CairoPlot.py,并粘贴到你要开发的Python脚本所在的目录下。
用扇形图说明:谁在发送垃圾邮件?
展开测绘工作之前,找到一个良好的数据源永远是我们的首要任务。针对这个项目,让我们先来分析一个Postfix日志文件,/var/log/mail.info,借以观察一系列垃圾邮件的众多来源。
通过对文件的随机检查,我们会发现有许多提出接收请求的邮件都来自一个客观上根本不存在的地址,举例说明:
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 : Helo command rejected: Host not found; from=<> to=<aiglance@mydomain.com> proto=ESMTP helo=
我们的posifix服务器一般会拒绝这样的邮件,因为通常情况下它们都是垃圾邮件。配置正确的邮件服务器应该不会编造这些虚假的地址——当然在有些配置有误的服务器上是会发生这种状况。
但是这些虚假的接收请求从何而来?他们是否来自特定的一些国家?而在这些特定国家的垃圾邮件来源中,存在多少.com类型网站,又有多少.net类型网站?
为了找到答案,我将创建一个Python索引系统,然后使用CairoPlot工具来测绘出一幅扇形图。索引中的每个关键字都将涵盖一个顶级域,例如“.com”;而其数值则为从该类型域中发来的被拒收邮件的数量。
剖析日志文件
要填充索引系统中的词条项目,意味着我们需要对/var/log/mail.info文件进行剖析。每封邮件的真正发出地址能够从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()
在结尾部分,通过以下内容将索引系统中的“拒收”标准传达给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}
创建扇形图
你要如何依据索引系统来创建一个扇形图?事实上一行命令即可实现:
- CairoPlot.pie_plot("piechart", rejected, 500, 500, None, True, False,
- None)
CairoPlot将生成一个名为pie.svg的图形文件(如图一所示)。
[attach]23[/attach]
- pie_plot(name,
- data,
- width, height,
- background=None,
- gradient=False, shadow=False,
- colors=None)
Name(名称)指文件名:如果你希望加入一个诸如.jpg之类的扩展名,那么CairoPlot将使用你所设定的格式来取代svg格式,因为在某些情况下你可能会需要一个IE用户能够通过页面正常浏览的图像。
Data(数据),当然了,代表索引系统中的数值。
Width(宽度)和Height(高度)代表你所希望的图形绘制尺寸。需要注意的是,CairoPlot预留给扇形图周边的空白区域是相当有限的,所以一定要注意整体规划。
Background(背景),你需要指定一种背景颜色,其选色方法为标准的RGB形式。因此,通过background=(0,1,0)这一指令,你将获得一个全绿的背景。你在这里也可以使用Cairo gradient(色阶)来进行设定.gradient(色阶)功能可以让你选择是否将你扇形图中的某一块显示出色彩渐变的效果,以使整个图形更加美观.shadow(阴影)功能将让你可以为整个扇形图增加底部阴影效果,并且如果你不喜欢系统默认的阴影颜色,也可以随意为其定义新的颜色。当然,阴影颜色同样即可以是单色也可以包含色阶。需要强调的是,所选颜色的数量必须与索引系统中的项目数量相同。
图一中的示例存在一个小问题:它显示绝大多数无效的接收请求来自根本无法解析的服务器地址,而表示状况的图形被压成极细小的一块,根本无法解读。而且显然你从那一大块“无法解析“的服务器来源中根本折腾不出什么有用的信息。在这种情况下,你可以在指令中if hostname:后面添加如下内容
- if hostname :
- dot = hostname.rfind(".")
- if dot >= 0 :
- ext = hostname[dot+1:]
- else :
- continue
运行上述命令,这时扇形图变为如图二所示。很有意思吧。直到编写这个实例,我才意识到相比起其它国家,我从以色列和巴西收到了这么多的垃圾邮件。有时候一幅清晰的示意图绝对胜过千言万语。
[attach]24[/attach]
条形图
CairoPlot也可以制作出很棒的条形图。但遗憾的是,CairoPlot的各种规则不太适合条形图数据的导入。条形图需要的是列表,而非索引。
这都不叫事儿!只要把上文中的索引系统转换为两个列表——一个包含标签信息,一个包含具体数据——再进行条形图绘制(如图三所示):
- 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)
[attach]25[/attach]
同制作扇形图一样,你可以导入一个颜色列表来使用自定义颜色,而且还有其它一些诸如背景、风格、圆滑边角、沙盘模型高度、象限体积以及必然具备的标签体积和标签高度等调节选项。
当然,CairoPlot同样可以制作其它类型的图形。这有一些实例文档,你也可以使用Python的交互式解析工具并输入如下内容:
- import CairoPlot
- help(CairoPlot.pie_plot)
CairoPlot站点将很可能迁移至Sourceforge网站,并提供更加完备的访问页面。与此同时,如果你已经有过一些实践经验,你一定会深切体会到CairoPlot在制作美观艳丽的图形方面绝对称得上是顶尖工具之一。
原文地址:http://www.linuxplanet.com/linuxplanet/tutorials/7317/1/
译文来自:http://os.51cto.com/art/201103/250253.htm
译者:核子可乐