python日誌記錄完整的異常資訊traceback stack
用python的異常處理和日誌可以完整的記錄程式發生異常時的出錯資訊。
這有賴於logging模組的強大和python的錯誤處理機制。
基本正規化是:
try:
do-something-block
except:
logger.exception("Exception Logged")
日誌的記錄形式如下:def setLogger(): # 建立一個logger,可以考慮如何將它封裝 logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) # 建立一個handler,用於寫入日誌檔案 fh = logging.FileHandler(os.path.join(os.getcwd(), 'log.txt')) fh.setLevel(logging.DEBUG) # 再建立一個handler,用於輸出到控制檯 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # 定義handler的輸出格式 formatter = logging.Formatter('%(asctime)s - %(module)s.%(funcName)s.%(lineno)d - %(levelname)s - %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) # 給logger新增handler logger.addHandler(fh) logger.addHandler(ch) # 記錄一條日誌 logger.info('hello world, i\'m log helper in python, may i help you') return logger #對單個表插入一個元組,其定義有 def insertOneData(conn,tableName,listColumn,lData): try: cursor=conn.cursor() sql="insert into "+tableName+"(" i=0 length=len(listColumn) for column in listColumn: if(i!=(length-1)): sql=sql+column+"," else: sql=sql+column+") values(" i=i+1 for i in range(0,length): if(i!=(length-1)): sql=sql+"%s," else: sql=sql+"%s);" logger.info(sql) logger.info(lData) cursor.execute(sql,lData); conn.commit() except: logger.exception("Exception Logged")
2012-04-30 22:29:39,173 - __init__.copyDataWithReplace.135 - ERROR - Exception Logged
Traceback (most recent call last):
File "C:\Eclipse java EE workspace\ReadExcel\tw_to_microblog\__init__.py", line 133, in copyDataWithReplace
insertOneData(newConn,newTbl,newColList,lData)
File "C:\Eclipse java EE workspace\ReadExcel\tw_to_microblog\__init__.py", line 156, in insertOneData
cursor.execute(sql,lData);
File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
IntegrityError: (1062, "Duplicate entry '95322' for key 'PRIMARY'")