一篇文章帶你搞定Python中l(wèi)ogging模塊
回復(fù)“Go語言”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
Hey,大家好呀,我是Go進(jìn)階者。
一、基礎(chǔ)使用
1. logging使用場(chǎng)景
日志是什么?這個(gè)不用多解釋。百分之九十的程序都需要提供日志功能。Python內(nèi)置的logging模塊,為我們提供了現(xiàn)成的高效好用的日志解決方案。但是,不是所有的場(chǎng)景都需要使用logging模塊,
下面是Python官方推薦的使用方法:(來源百度)
| 任務(wù)場(chǎng)景 | 最佳工具 |
|---|---|
| 普通情況下,在控制臺(tái)顯示輸出 | print() |
| 報(bào)告正常程序操作過程中發(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)重程度由低到高排列(注意是全部大寫!因?yàn)樗鼈兪浅A俊#?/span>
import logginglogging.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。通過賦予logger或者h(yuǎn)andler不同的級(jí)別,開發(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ù)意義相同,指定日志文件的打開模式,'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. 將日志寫入到文件
設(shè)置logging,創(chuàng)建一個(gè)FileHandler,并對(duì)輸出消息的格式進(jìn)行設(shè)置,將其添加到logger,然后將日志寫入到指定的文件。
import logginglogger = 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. 將日志同時(shí)輸出到屏幕和日志文件
logger中添加StreamHandler,可以將日志輸出到屏幕上
import logginglogger = logging.getLogger(__name__)logger.setLevel(level = logging.INFO) #添加StreamHandlerhandler = 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) #添加StreamHandlerlogger.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)存耗盡、磁盤空間為空,一般很少使用ERROR:發(fā)生錯(cuò)誤時(shí),如IO操作失敗或者連接問題WARNING:發(fā)生很重要的事件,但是并不是錯(cuò)誤時(shí),如用戶登錄密碼錯(cuò)誤INFO:處理請(qǐng)求或者狀態(tài)變化等日常事務(wù)DEBUG:調(diào)試過程中使用DEBUG等級(jí),如算法中每個(gè)循環(huán)的中間狀態(tài)
4. 捕獲traceback
Python中的traceback模塊被用于跟蹤異常返回信息,可以在logging中記錄下traceback.
import logginglogger = 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):raiseexcept 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)用中遇到的問題,進(jìn)行了詳細(xì)的解答。
????通過一些案例的講解和運(yùn)行效果圖的截取,使用Python語言,能夠幫助讀者更好的去理解Python。
????我是Go進(jìn)階者,如果覺得還不錯(cuò),記得動(dòng)手點(diǎn)贊一下哈。感謝你的觀看!
-------------------?End?-------------------
歡迎大家點(diǎn)贊,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬水千山總是情,點(diǎn)個(gè)【在看】行不行
