昨天因工作需求要写一个python脚本,来测试memcache服务器。因为第一次写python脚本在线上运行,所以不敢大意。而又因为我自己看着python教程自学了一点python知识就赶脚自己能写出来。。。。结果花了四五个小时愣是没写出来。在这里记录一下这次苦逼的过程。。。。。

 第一回合,开始,因为要测试memcache服务就直接用python的memcache插件python-memcached。直接yum安装:

# yum install python-memecachedghdm

安装好之后来测试下:

>>> import memcache
>>>mc=memcache.Client(['127.0.0.1:12121'])
>>>mc.set("foo","bar")
True
>>>mc.get("foo")
bar
>>>


测试成功连接到memcached,但是如果当memcache出现故障时该如何获得错误信息呢?,这是我昨天下午一直纠结的问题,可能能python不熟悉吧!然后通过help(memecache)帮助查看memcache文档信息。查找到有个方法可以获得memcache的状态信息——get_stats()。。然后脚本版本一就出炉了::

#!/usr/bin/python
import sys,os
import memcache
def mem():
    try:
        mc = memcache.Client(['127.0.0.1:12121'], debug=0)
        conn = mc.get_stats()
        memstat = conn[0][1]
    except:
        print 'please check your memcached host and port'
        sys.exit(3)
if __name__ == '__main__':
    mem()

脚本出来,很简单,可是用了很长时间。这个只能判断出host或端口出错的时候,对于连接超时的现象却没有很好的显示出来,对于host或者port那个方面出问题了也没有很好的区分。问题有了脚本写的还是不行的,然后又开始谷歌、百度等等一系列的搜索……,,,最后,同事给提供更一个python的memcache插件——umemcached ,,,然后……

第二回合:开始开安装umemcache

下载地址:
https://github.com/esnme/ultramemcache/wiki
# unzip ultramemcache-master.zip
# cd ultramemcache-master
# python setup.py install

如果报错的话,直接yum install python-devel就行了。

安装完成后先来测试一下

>>>import umemcache
>>>mc=memcache.Client('127.0.0.1:12121')
>>>mc.connetc()
Traceback (most recent call last):
  File "test.py", line 38, in mem
    conn.connect()
  File "<string>", line 1, in connect
gaierror: [Errno -2] Name or service not known
##如果服务器端有误就会报错

这个umemcache插件返回的错误信息要好的多,只要把这些错误信息过滤一下就行了,,这就要用到python的异常处理了,,然后又开始了新一轮的 谷歌、百度之旅。。。。-_-!  查到了python的try except处理异常的模块,,一看之下,,sb了。。。可以捕捉到异常,可是异常信息总是获得不到,本意为可以让脚本结果返回到日志就行了,可是测试结果python脚本直接打印出失败信息,不会通过重定向到文件中,下面是脚本和测试

#!/usr/bin/python
import umemcache
def mem():
    conn=umemcache.Client('127.0.0.1:12121')
    conn.connect()
if __name__ == '__main__':
    mem()

脚本执行后如果服务器端有错误会直接跳出来。

Traceback (most recent call last):
  File "test.py", line 38, in mem
    conn.connect()
  File "<string>", line 1, in connect
gaierror: [Errno -2] Name or service not known

以上是错误信息。。。。

然后又一次谷歌、百度谷歌如何获得异常信息,,最后还搞了自定义异常,……等等 就这样昨天一下午的时光没了,然后心里异常的纠结和郁闷…………

第三回合:问题一直拖到了今天上午,以为自己实在是搞不出来,但是还是不甘心,第一次写python脚本就是这样的结果,也太衰了吧!!!,,然后今天上午就又开始搞这个脚本,找一下有关python处理异常的文章,真不巧看一篇文章是有关介绍python异常模块,一边看一边试,突然看到可以把异常写到文件中,这回可好了,总算把问题给解决了,这里放一个图片从那个文章中截取的。

133642387.jpg

从这个脚本中我看到了希望,看到光明啊!!!

然后我的脚本就变成这样:

#!/usr/bin/python
import umemcache
import traceback
def mem():
    try:
        conn=umemcache.Client('127.0.0.1:12121')
        conn.connect()
    except:
        fp = StringIO.StringIO()
        traceback.print_exc(file=fp)
        message = fp.getvalue()
        print message
if __name__ == '__main__':
    mem()

然后就只要处理message这个变量就行了,,然后就开始给脚本升级再加些代码让它处理一下返回信息,写到日志中。最后脚本最终版本是:

#!/usr/bin/python
# encoding: UTF-8
import umemcache
import traceback
import StringIO
import re
import datetime
import sys,os
work_dir="/usr/local/scripts/"
os.chdir(work_dir)
def mem_log(message):
    file=open('memcache.txt','w')
    file.write(message)
    file.close()
    f=open('memcache.txt','r')
    while 1:
        line=f.readline()
        pattern = re.compile(r'.*error.*')
        match = pattern.search(line)
        if match:
          now=datetime.datetime.today()
          log=open('memcache.log','a')
          log.write(now.strftime('%Y-%m-%d %H:%M:%S'))
          log.write(" ")
          log.write(match.group(0))
          log.write(" \n")
          log.close()
        if not line:
            break
    f.close()
def mem():
    try:
        conn=umemcache.Client('127.0.0.1:12121')
        conn.connect()
    except:
        fp = StringIO.StringIO()
        traceback.print_exc(file=fp)
        message = fp.getvalue()
        mem_log(message)
if __name__ == '__main__':
    mem()

这是脚本的全部代码,python方面是新手中的菜鸟,,在这里请高手多指教。谢谢!