昨天因工作需求要寫一個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方面是新手中的菜鳥,,在這裏請高手多指教。謝謝!