Python 程序員必須掌握的日志記錄
寫(xiě)在之前
在我們的現(xiàn)實(shí)生活中,「日志記錄」其實(shí)是一件非常重要的事情,比如銀行的轉(zhuǎn)賬記錄,汽車(chē)的行車(chē)記錄儀記錄行駛過(guò)程中的一切,如果出現(xiàn)了什么問(wèn)題,我們可以通過(guò)「日志記錄」來(lái)搞清楚到底發(fā)生了什么事情。
除了在生活中,在日常的系統(tǒng)開(kāi)發(fā)以及調(diào)試等過(guò)程中,記錄日志同樣是一件很重要的事情。很多編程初學(xué)者并沒(méi)有「記錄日志」的習(xí)慣,認(rèn)為記錄日志是一件可有可無(wú)的事情,出現(xiàn)問(wèn)題的時(shí)候只要使用 print 函數(shù)打印一下程序的中間結(jié)果即可,真是 too young too naive。只是 print 的話對(duì)于簡(jiǎn)單的腳本程序來(lái)說(shuō)或許可行,可是到了碰到復(fù)雜的系統(tǒng),你如果還是只用 print 這種方式的話,你會(huì)看到大量的消息,看到吐也不一定能找到其中有用的消息。
「日志」是一個(gè)系統(tǒng)的重要組成部分,用來(lái)記錄用戶操作、系統(tǒng)運(yùn)行狀態(tài)和錯(cuò)誤信息,它的好壞直接影響到系統(tǒng)出現(xiàn)問(wèn)題時(shí)定位的速度,有日志記錄,我們可以在服務(wù)崩潰的時(shí)候很快的通過(guò)查看日志來(lái)發(fā)現(xiàn)問(wèn)題出現(xiàn)的地方,同樣也可以通過(guò)對(duì)日志的觀察和分析,提前發(fā)現(xiàn)系統(tǒng)可能存在的風(fēng)險(xiǎn)。
Python 的標(biāo)準(zhǔn)日志模塊
上面我們說(shuō)了「日志」是如此的重要,作為無(wú)所不能的 Python 當(dāng)然也有日志相關(guān)的功能,Python 標(biāo)準(zhǔn)庫(kù)中提供了 logging 模塊供我們使用。在最簡(jiǎn)單的使用中,默認(rèn)情況下 logging 將日志打印到屏幕終端,我們可以直接導(dǎo)入 logging 模塊,然后調(diào)用 debug,info,warn,error 和 critical 等函數(shù)來(lái)記錄日志,默認(rèn)日志的級(jí)別為 warning,級(jí)別比 warning 高的日志才會(huì)被顯示(critical > error > warning > info > debug),「級(jí)別」是一個(gè)邏輯上的概念,用來(lái)區(qū)分日志的重要程度。
import logging logging.debug('debug message') logging.info("info message") logging.warn('warn message') logging.error("error message") logging.critical('critical message')
上述代碼的執(zhí)行結(jié)果如下所示:
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message
我在上面說(shuō)過(guò),用 print 的話會(huì)產(chǎn)生大量的信息,從而很難從中找到真正有用的信息。而 logging 中將日志分成不同的級(jí)別以后,我們?cè)诖蠖鄶?shù)時(shí)間只保存級(jí)別比較高的日志信息,從而提高了日志的性能和分析速度,這樣我們就可以很快速的從一個(gè)很大的日志文件里找到錯(cuò)誤的信息。
配置日志格式
我們?cè)谟?logging 來(lái)記錄日志之前,先來(lái)進(jìn)行一些簡(jiǎn)單的配置:
import logging logging.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 對(duì)日志進(jìn)行了簡(jiǎn)單的配置,其實(shí)我們還可以進(jìn)行更為復(fù)雜些的配置,在此之前,我們先來(lái)了解一下 logging 中的幾個(gè)概念:
- Logger:日志記錄器,是應(yīng)用程序中可以直接使用的接口。
- Handler:日志處理器,用以表明將日志保存到什么地方以及保存多久。
- Formatter:格式化,用以配置日志的輸出格式。
上述三者的關(guān)系是:一個(gè) Logger 使用一個(gè) Handler,一個(gè) Handler 使用一個(gè) Formatter。那么概念我們知道了,該如何去使用它們呢?我們的 logging 中有很多種方式來(lái)配置文件,簡(jiǎn)單的就用上面所說(shuō)的 basicConfig,對(duì)于比較復(fù)雜的我們可以將日志的配置保存在一個(gè)配置文件中,然后在主程序中使用 fileConfig 讀取配置文件。
基本的知識(shí)我們知道了,下面我們來(lái)做一個(gè)小的題目:日志文件保存所有 debug 及其以上級(jí)別的日志,每條日志中要有打印日志的時(shí)間,日志的級(jí)別和日志的內(nèi)容。請(qǐng)先自己嘗試著思考一下,如果你已經(jīng)思考完畢請(qǐng)繼續(xù)向下看:
import logging logging.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 message
2018-10-19 22:50:35,225 : INFO : info message
2018-10-19 22:50:35,225 : WARNING : warn message
2018-10-19 22:50:35,225 : ERROR : error message
2018-10-19 22:50:35,225 : CRITICAL : critical message
我剛剛在上面說(shuō)過(guò),對(duì)于比較復(fù)雜的我們可以將日志的配置保存在一個(gè)配置文件中,然后在主程序中使用 fileConfig 讀取配置文件。下面我們就來(lái)看一個(gè)典型的日志配置文件(配置文件名為 logging.conf):
[loggers] keys = root [handlers] keys = logfile [formatters] keys = generic [logger_root] handlers = logfile [handler_logfile] class = handlers.TimedRotatingFileHandler args = ('test.log', 'midnight', 1, 10) level = DEBUG formatter = generic [formatter_generic] format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s
在上述的日志配置文件中,首先我們?cè)?[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í)間,級(jí)別、文件名以及行號(hào)等信息。
有了上述的配置文件以后,我們就可以在主代碼中使用 logging.conf 模塊的 fileConfig 函數(shù)加載日志配置:
import logging import logging.config logging.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 message
2018-10-19 23:00:02,809 ERROR [root:9] error message
2018-10-19 23:00:02,809 CRITI [root:10] critical message
寫(xiě)在之后
正如標(biāo)題中所說(shuō)的那樣,我認(rèn)為「日志記錄」是每個(gè) Python 程序員必須要知道且學(xué)會(huì)的東西,也是每個(gè)程序員必須具備的意識(shí)。如果你之前沒(méi)有使用過(guò)日志亦或者說(shuō)不知道該怎么去使用日志記錄,這篇文章我相信會(huì)給你帶來(lái)一些幫助。
Python 的日志庫(kù)設(shè)計(jì)之好,用起來(lái)之靈活,可以說(shuō)是 Python 標(biāo)準(zhǔn)庫(kù)中相當(dāng)優(yōu)秀的存在。當(dāng)然上面我們所說(shuō)的只是 Python 日志庫(kù)中很少的一部分,更多的操作和內(nèi)容還需要你在今后的學(xué)習(xí)和實(shí)踐中自己去發(fā)掘和運(yùn)用。
The end。
以上就是Python 程序員必須掌握的日志記錄的詳細(xì)內(nèi)容,更多關(guān)于python 日志的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python腳本實(shí)現(xiàn)Zabbix多行日志監(jiān)控過(guò)程解析
- Python中l(wèi)ogging日志記錄到文件及自動(dòng)分割的操作代碼
- python logging 重復(fù)寫(xiě)日志問(wèn)題解決辦法詳解
- Python中l(wèi)ogger日志模塊詳解
- Python logging日志模塊 配置文件方式
- python3中的logging記錄日志實(shí)現(xiàn)過(guò)程及封裝成類的操作
- python實(shí)時(shí)監(jiān)控logstash日志代碼
- Python日志logging模塊功能與用法詳解
- Python日志器使用方法及原理解析
相關(guān)文章
Python如何使用opencv進(jìn)行手勢(shì)識(shí)別詳解
目前,人們正需要研發(fā)以人為中心進(jìn)行計(jì)算機(jī)交互控制,所以下面這篇文章主要給大家介紹了關(guān)于Python如何使用opencv進(jìn)行手勢(shì)識(shí)別的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01python發(fā)送郵件功能實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了python發(fā)送郵件功能實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02多個(gè)geojson經(jīng)過(guò)坐標(biāo)系轉(zhuǎn)換后如何合并為一個(gè)shp數(shù)據(jù)
這篇文章主要介紹了多個(gè)geojson經(jīng)過(guò)坐標(biāo)系轉(zhuǎn)換后如何合并為一個(gè)shp數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10python+selenium定時(shí)爬取丁香園的新型冠狀病毒數(shù)據(jù)并制作出類似的地圖(部署到云服務(wù)器)
這篇文章主要介紹了python+selenium定時(shí)爬取丁香園的新冠病毒每天的數(shù)據(jù)并制作出類似的地圖(部署到云服務(wù)器),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02python 異常的傳遞性及主動(dòng)拋出學(xué)習(xí)
這篇文章主要為大家介紹了python 異常的傳遞性及主動(dòng)拋出學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03python 實(shí)現(xiàn)將Numpy數(shù)組保存為圖像
今天小編就為大家分享一篇python 實(shí)現(xiàn)將Numpy數(shù)組保存為圖像,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01