昨天因工作需求要写一个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异常模块,一边看一边试,突然看到可以把异常写到文件中,这回可好了,总算把问题给解决了,这里放一个图片从那个文章中截取的。
从这个脚本中我看到了希望,看到光明啊!!!
然后我的脚本就变成这样:
#!/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方面是新手中的菜鸟,,在这里请高手多指教。谢谢!
转载于:https://blog.51cto.com/zhou123/1280533