CairoPlot让Linux服务器的日志文件更直观(1)


51CTO精选译文】确实有些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 <ex02.maccabiworld.org>: Helo command rejected: Host not found; from=<> to=<aiglance@mydomain.com> proto=ESMTP helo=<ex02.maccabiworld.org>

我们的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}


相关内容