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