一篇文章帶你搞定 Python 中 Logging 模塊
Hey,大家好呀,我是Go進(jìn)階者。
一、基礎(chǔ)使用
1. logging使用場(chǎng)景
日志是什么?這個(gè)不用多解釋。百分之九十的程序都需要提供日志功能。Python內(nèi)置的logging模塊,為我們提供了現(xiàn)成的高效好用的日志解決方案。但是,不是所有的場(chǎng)景都需要使用logging模塊,
下面是Python官方推薦的使用方法:(來(lái)源百度)
| 任務(wù)場(chǎng)景 | 最佳工具 | 
|---|---|
| 普通情況下,在控制臺(tái)顯示輸出 | print() | 
        
| 報(bào)告正常程序操作過(guò)程中發(fā)生的事件 | logging.info()(或者更詳細(xì)的logging.debug()) | 
        
| 發(fā)出有關(guān)特定事件的警告 | warnings.warn()或者logging.warning() | 
        
| 報(bào)告錯(cuò)誤 | 彈出異常 | 
| 在不引發(fā)異常的情況下報(bào)告錯(cuò)誤 | logging.error(), logging.exception()或者logging.critical() | 
        
logging模塊定義了下表所示的日志級(jí)別,按事件嚴(yán)重程度由低到高排列(注意是全部大寫(xiě)!因?yàn)樗鼈兪浅A俊?:
- import logging
 - logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 - logger = logging.getLogger(__name__)
 - logger.info("Start print log")
 - logger.debug("Do something")
 - logger.warning("Something maybe fail.")
 - logger.info("Finish")
 
logging中可以選擇很多消息級(jí)別,如debug、info、warning、error以及critical。通過(guò)賦予logger或者h(yuǎn)andler不同的級(jí)別,開(kāi)發(fā)者就可以只輸出錯(cuò)誤信息到特定的記錄文件,或者在調(diào)試時(shí)只記錄調(diào)試信息。
- logging.basicConfig(level = logging.DEBUG,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 
例如,我們將logger的級(jí)別改為DEBUG,
再觀察一下輸出結(jié)果:
控制臺(tái)輸出,可以發(fā)現(xiàn),輸出了debug的信息。
- logging.basicConfig函數(shù)各參數(shù):
 - filename:指定日志文件名;
 - filemode:和file函數(shù)意義相同,指定日志文件的打開(kāi)模式,'w'或者'a';
 - format:指定輸出的格式和內(nèi)容,format可以輸出很多有用的信息。
 - datefmt:指定時(shí)間格式,同time.strftime();
 - level:設(shè)置日志級(jí)別,默認(rèn)為logging.WARNNING;
 - stream:指定將日志的輸出流,可以指定輸出到sys.stderr,sys.stdout或者文件,默認(rèn)輸出到sys.stderr,當(dāng)stream和filename同時(shí)指定時(shí),stream被忽略;
 
- #參數(shù):作用
 - %(levelno)s:打印日志級(jí)別的數(shù)值
 - %(levelname)s:打印日志級(jí)別的名稱
 - %(pathname)s:打印當(dāng)前執(zhí)行程序的路徑,其實(shí)就是sys.argv[0]
 - %(filename)s:打印當(dāng)前執(zhí)行程序名
 - %(funcName)s:打印日志的當(dāng)前函數(shù)
 - %(lineno)d:打印日志的當(dāng)前行號(hào)
 - %(asctime)s:打印日志的時(shí)間
 - %(thread)d:打印線程ID
 - %(threadName)s:打印線程名稱
 - %(process)d:打印進(jìn)程ID
 - %(message)s:打印日志信息
 
2. 將日志寫(xiě)入到文件
設(shè)置logging,創(chuàng)建一個(gè)FileHandler,并對(duì)輸出消息的格式進(jìn)行設(shè)置,將其添加到logger,然后將日志寫(xiě)入到指定的文件。
- import logging
 - logger = logging.getLogger(__name__)
 - logger.setLevel(level = logging.INFO)
 - handler = logging.FileHandler("log.txt")
 - handler.setLevel(logging.INFO)
 - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 - handler.setFormatter(formatter)
 - logger.addHandler(handler)
 - logger.info("Start print log")
 - logger.debug("Do something")
 - logger.warning("Something maybe fail.")
 - logger.info("Finish")
 
打開(kāi)log.txt文件。
2. 將日志同時(shí)輸出到屏幕和日志文件
logger中添加StreamHandler,可以將日志輸出到屏幕上
- import logging
 - logger = logging.getLogger(__name__)
 - logger.setLevel(level = logging.INFO) #添加StreamHandler
 - handler = logging.FileHandler("log.txt")
 - handler.setLevel(logging.INFO)
 - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 - handler.setFormatter(formatter)
 - console = logging.StreamHandler()
 - console.setLevel(logging.INFO) #添加StreamHandler
 - logger.addHandler(handler)
 - logger.addHandler(console)
 - logger.info("Start print log")
 - logger.debug("Do something")
 - logger.warning("Something maybe fail.")
 - logger.info("Finish")
 
控制臺(tái)信息。
log.text信息。
3. 設(shè)置消息的等級(jí)
可以設(shè)置不同的日志等級(jí),用于控制日志的輸出。
- #日志等級(jí):使用范圍
 - FATAL:致命錯(cuò)誤
 - CRITICAL:特別糟糕的事情,如內(nèi)存耗盡、磁盤(pán)空間為空,一般很少使用
 - ERROR:發(fā)生錯(cuò)誤時(shí),如IO操作失敗或者連接問(wèn)題
 - WARNING:發(fā)生很重要的事件,但是并不是錯(cuò)誤時(shí),如用戶登錄密碼錯(cuò)誤
 - INFO:處理請(qǐng)求或者狀態(tài)變化等日常事務(wù)
 - DEBUG:調(diào)試過(guò)程中使用DEBUG等級(jí),如算法中每個(gè)循環(huán)的中間狀態(tài)
 
4. 捕獲traceback
Python中的traceback模塊被用于跟蹤異常返回信息,可以在logging中記錄下traceback.
- import logging
 - logger = logging.getLogger(__name__)
 - logger.setLevel(level = logging.INFO)
 - handler = logging.FileHandler("log.txt")
 - handler.setLevel(logging.INFO)
 - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 - handler.setFormatter(formatter)
 - console = logging.StreamHandler()
 - console.setLevel(logging.INFO)
 - logger.addHandler(handler)
 - logger.addHandler(console)
 - logger.info("Start print log")
 - logger.debug("Do something")
 - logger.warning("Something maybe fail.")
 - try:
 - open("sklearn.txt","rb")
 - except (SystemExit,KeyboardInterrupt):
 - raise
 - except Exception:
 - logger.error("Faild to open sklearn.txt from logger.error",exc_info = True)
 - logger.info("Finish")
 
控制臺(tái)和日志文件log.txt中輸出。
可以使用logger.exception(msg,args),它等價(jià)于logger.error(msg,exc_info = True,args)。
將logger.error("Faild to open sklearn.txt from logger.error",exc_info = True)
替換為logger.exception("Failed to open sklearn.txt from logger.exception")
控制臺(tái)和日志文件log.txt中輸出。
二、總結(jié)
本文以Pythonl基礎(chǔ)為例,主要介紹了logging模塊的基礎(chǔ)使用方法,以及在現(xiàn)實(shí)應(yīng)用中遇到的問(wèn)題,進(jìn)行了詳細(xì)的解答。
通過(guò)一些案例的講解和運(yùn)行效果圖的截取,使用Python語(yǔ)言,能夠幫助讀者更好的去理解Python。
我是Go進(jìn)階者,如果覺(jué)得還不錯(cuò),記得動(dòng)手點(diǎn)贊一下哈。感謝你的觀看!






















 
 
 






 
 
 
 