記一次python腳本的編寫過程

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











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章