1. 程式人生 > >python日誌記錄完整的異常資訊traceback stack

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'")