Python 程序員必須掌握的日志記錄
寫在之前
在我們的現(xiàn)實(shí)生活中,「日志記錄」其實(shí)是一件非常重要的事情,比如銀行的轉(zhuǎn)賬記錄,汽車的行車記錄儀記錄行駛過程中的一切,如果出現(xiàn)了什么問題,我們可以通過「日志記錄」來搞清楚到底發(fā)生了什么事情。
除了在生活中,在日常的系統(tǒng)開發(fā)以及調(diào)試等過程中,記錄日志同樣是一件很重要的事情。很多編程初學(xué)者并沒有「記錄日志」的習(xí)慣,認(rèn)為記錄日志是一件可有可無的事情,出現(xiàn)問題的時(shí)候只要使用 print 函數(shù)打印一下程序的中間結(jié)果即可,真是 too young too naive。只是 print 的話對于簡單的腳本程序來說或許可行,可是到了碰到復(fù)雜的系統(tǒng),你如果還是只用 print 這種方式的話,你會看到大量的消息,看到吐也不一定能找到其中有用的消息。
「日志」是一個(gè)系統(tǒng)的重要組成部分,用來記錄用戶操作、系統(tǒng)運(yùn)行狀態(tài)和錯(cuò)誤信息,它的好壞直接影響到系統(tǒng)出現(xiàn)問題時(shí)定位的速度,有日志記錄,我們可以在服務(wù)崩潰的時(shí)候很快的通過查看日志來發(fā)現(xiàn)問題出現(xiàn)的地方,同樣也可以通過對日志的觀察和分析,提前發(fā)現(xiàn)系統(tǒng)可能存在的風(fēng)險(xiǎn)。
Python 的標(biāo)準(zhǔn)日志模塊
上面我們說了「日志」是如此的重要,作為無所不能的 Python 當(dāng)然也有日志相關(guān)的功能,Python 標(biāo)準(zhǔn)庫中提供了 logging 模塊供我們使用。在最簡單的使用中,默認(rèn)情況下 logging 將日志打印到屏幕終端,我們可以直接導(dǎo)入 logging 模塊,然后調(diào)用 debug,info,warn,error 和 critical 等函數(shù)來記錄日志,默認(rèn)日志的級別為 warning,級別比 warning 高的日志才會被顯示(critical > error > warning > info > debug),「級別」是一個(gè)邏輯上的概念,用來區(qū)分日志的重要程度。
import logginglogging.debug(’debug message’)logging.info('info message')logging.warn(’warn message’)logging.error('error message')logging.critical(’critical message’)
上述代碼的執(zhí)行結(jié)果如下所示:
WARNING:root:warn messageERROR:root:error messageCRITICAL:root:critical message
我在上面說過,用 print 的話會產(chǎn)生大量的信息,從而很難從中找到真正有用的信息。而 logging 中將日志分成不同的級別以后,我們在大多數(shù)時(shí)間只保存級別比較高的日志信息,從而提高了日志的性能和分析速度,這樣我們就可以很快速的從一個(gè)很大的日志文件里找到錯(cuò)誤的信息。
配置日志格式
我們在用 logging 來記錄日志之前,先來進(jìn)行一些簡單的配置:
import logginglogging.basicConfig(filename= ’test.log’, level= logging.INFO)logging.debug(’debug message’)logging.info('info message')logging.warn(’warn message’)logging.error('error message')logging.critical(’critical message’)
上面的例子中,我是用 basicConfig 對日志進(jìn)行了簡單的配置,其實(shí)我們還可以進(jìn)行更為復(fù)雜些的配置,在此之前,我們先來了解一下 logging 中的幾個(gè)概念:
Logger:日志記錄器,是應(yīng)用程序中可以直接使用的接口。 Handler:日志處理器,用以表明將日志保存到什么地方以及保存多久。 Formatter:格式化,用以配置日志的輸出格式。上述三者的關(guān)系是:一個(gè) Logger 使用一個(gè) Handler,一個(gè) Handler 使用一個(gè) Formatter。那么概念我們知道了,該如何去使用它們呢?我們的 logging 中有很多種方式來配置文件,簡單的就用上面所說的 basicConfig,對于比較復(fù)雜的我們可以將日志的配置保存在一個(gè)配置文件中,然后在主程序中使用 fileConfig 讀取配置文件。
基本的知識我們知道了,下面我們來做一個(gè)小的題目:日志文件保存所有 debug 及其以上級別的日志,每條日志中要有打印日志的時(shí)間,日志的級別和日志的內(nèi)容。請先自己嘗試著思考一下,如果你已經(jīng)思考完畢請繼續(xù)向下看:
import logginglogging.basicConfig( level= logging.DEBUG, format = ’%(asctime)s : %(levelname)s : %(message)s’, filename= 'test.log')logging.debug(’debug message’)logging.info('info message')logging.warn(’warn message’)logging.error('error message')logging.critical(’critical message’)
上述代碼的一次運(yùn)行結(jié)果如下:
2018-10-19 22:50:35,225 : DEBUG : debug message2018-10-19 22:50:35,225 : INFO : info message2018-10-19 22:50:35,225 : WARNING : warn message2018-10-19 22:50:35,225 : ERROR : error message2018-10-19 22:50:35,225 : CRITICAL : critical message
我剛剛在上面說過,對于比較復(fù)雜的我們可以將日志的配置保存在一個(gè)配置文件中,然后在主程序中使用 fileConfig 讀取配置文件。下面我們就來看一個(gè)典型的日志配置文件(配置文件名為 logging.conf):
[loggers]keys = root[handlers]keys = logfile[formatters]keys = generic[logger_root]handlers = logfile[handler_logfile]class = handlers.TimedRotatingFileHandlerargs = (’test.log’, ’midnight’, 1, 10)level = DEBUGformatter = generic[formatter_generic]format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s
在上述的日志配置文件中,首先我們在 [loggers] 中聲明了一個(gè)叫做 root 的日志記錄器(logger),在 [handlers] 中聲明了一個(gè)叫 logfile 的日志處理器(handler),在 [formatters] 中聲明了一個(gè)名為 generic 的格式化(formatter)。之后在 [logger_root] 中定義 root 這個(gè)日志處理器(logger) 所使用的日志處理器(handler) 是哪個(gè),在 [handler_logfile] 中定義了日志處理器(handler) 輸出日志的方式、日志文件的切換時(shí)間等。最后在 [formatter_generic] 中定義了日志的格式,包括日志的產(chǎn)生時(shí)間,級別、文件名以及行號等信息。
有了上述的配置文件以后,我們就可以在主代碼中使用 logging.conf 模塊的 fileConfig 函數(shù)加載日志配置:
import loggingimport logging.configlogging.config.fileConfig(’logging.conf’)logging.debug(’debug message’)logging.info('info message')logging.warn(’warn message’)logging.error('error message')logging.critical(’critical message’)
上述代碼的運(yùn)行一次的結(jié)果如下所示:
2018-10-19 23:00:02,809 WARNI [root:8] warn message2018-10-19 23:00:02,809 ERROR [root:9] error message2018-10-19 23:00:02,809 CRITI [root:10] critical message
寫在之后
正如標(biāo)題中所說的那樣,我認(rèn)為「日志記錄」是每個(gè) Python 程序員必須要知道且學(xué)會的東西,也是每個(gè)程序員必須具備的意識。如果你之前沒有使用過日志亦或者說不知道該怎么去使用日志記錄,這篇文章我相信會給你帶來一些幫助。
Python 的日志庫設(shè)計(jì)之好,用起來之靈活,可以說是 Python 標(biāo)準(zhǔn)庫中相當(dāng)優(yōu)秀的存在。當(dāng)然上面我們所說的只是 Python 日志庫中很少的一部分,更多的操作和內(nèi)容還需要你在今后的學(xué)習(xí)和實(shí)踐中自己去發(fā)掘和運(yùn)用。
The end。
以上就是Python 程序員必須掌握的日志記錄的詳細(xì)內(nèi)容,更多關(guān)于python 日志的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. html中的form不提交(排除)某些input 原創(chuàng)2. ASP動態(tài)網(wǎng)頁制作技術(shù)經(jīng)驗(yàn)分享3. ASP常用日期格式化函數(shù) FormatDate()4. CSS3實(shí)現(xiàn)動態(tài)翻牌效果 仿百度貼吧3D翻牌一次動畫特效5. asp.net core項(xiàng)目授權(quán)流程詳解6. XMLHTTP資料7. vue使用moment如何將時(shí)間戳轉(zhuǎn)為標(biāo)準(zhǔn)日期時(shí)間格式8. CSS3中Transition屬性詳解以及示例分享9. jsp文件下載功能實(shí)現(xiàn)代碼10. 開發(fā)效率翻倍的Web API使用技巧
