python 消息框但不影响程序执行_还在用print()查找错误?日志消息不香嘛?| 原力计划...
作者 | 灰小猿
責(zé)編 | 王曉曼
出品 | CSDN博客
最近在做項(xiàng)目開(kāi)發(fā)的時(shí)候,跟小伙伴聊到修 Bug 這件事。
嗯,對(duì)于一只沒(méi)技術(shù)的程序猿來(lái)說(shuō),修 Bug 的確是一件讓人頭疼的事情,尤其是對(duì)于比較大型的項(xiàng)目開(kāi)發(fā),在變量較多的時(shí)候,一次次的檢查錯(cuò)誤是真的讓頭發(fā)顫抖。
在這里想問(wèn)一下有多少小伙伴是在 Python 中使用 print 來(lái)輸出某個(gè)變量從而檢查參數(shù)錯(cuò)誤的?
嗯…沒(méi)禿頭以前我也是這樣做的,后來(lái)我為了以后有更多的時(shí)間去修 Bug,慢慢的發(fā)現(xiàn)斷言是個(gè)好東西,再后來(lái)為了直接觀察到整個(gè)程序某個(gè)值的變化過(guò)程,發(fā)現(xiàn)還是日志處理是真香。
那么今天大灰狼就來(lái)和大家聊聊 Python 日志處理的那些梗!
記日志是一件很棒的事,它可以很好的幫助我們理解程序中發(fā)生的事以及事情發(fā)生的順序。
在 Python 中記錄程序運(yùn)行的日志文件時(shí),我們需要調(diào)用 logging 模塊,通過(guò)該模塊,我們很容易的創(chuàng)建自定義的消息記錄,這些日志消息將描述程序執(zhí)行時(shí),何時(shí)達(dá)到日志函數(shù)的調(diào)用,并列出我們想要指定的任何變量當(dāng)時(shí)的值。
另一方面來(lái)說(shuō)呢,如果我們?cè)谌罩疚募邪l(fā)現(xiàn)某些日志消息缺失,這就表明有一部分代碼被跳過(guò),從未執(zhí)行。這意味著什么…嗯,我想作為程序猿的你應(yīng)該也很清楚。
使用日志模塊
使用日志消息要啟用 logging 模塊,在程序運(yùn)行時(shí)將日志信息顯示在屏幕上,所以我們當(dāng)然需要先調(diào)用該模塊了,并且輸入以下代碼:
#調(diào)用logging函數(shù)
import logging
logging.basicConfig(filename='logginginfo.txt', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
這行代碼的作用是定義的一個(gè)輸出格式,輸出某一條日志消息執(zhí)行的時(shí)間。
當(dāng) Python 記錄一個(gè)事件的日志時(shí),它會(huì)創(chuàng)建一個(gè) LogRecord 對(duì)象,保存關(guān)于該事件的信息,Logging 模塊的函數(shù)讓你能夠指定看到這個(gè) LogRecord 對(duì)象的細(xì)節(jié),以及希望的細(xì)節(jié)展示方式。
值得注意的是,當(dāng)我們想要將監(jiān)控的值通過(guò)日志文件進(jìn)行輸出時(shí),需要調(diào)用 logging.deBug 函數(shù),并且該函數(shù)的輸出方式與 print 相同,而這行消息輸出值的格式,就是我們最開(kāi)始在 logging.loasicConfig 中指定的,并且包括我們傳遞給 debug 的參數(shù)消息。
以一個(gè)計(jì)算階乘的函數(shù)為例,我們監(jiān)控該函數(shù)中每一個(gè)變量在程序運(yùn)行時(shí)值的變化情況:
#階乘計(jì)算日志消息輸出實(shí)例
import logging
logging.basicConfig( level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
#logging.disable(logging.CRITICAL)
logging.debug("程序測(cè)試:")
def factorial(n):
logging.debug("階乘數(shù)為:%s" %(n))
result = 1
for i in range(1, n + 1):
result *= i
logging.debug("此時(shí)乘的數(shù)為:%s, 結(jié)果是%s" %(i, result))
logging.debug('最終結(jié)果:%s' %(result))
return result
print(factorial(5))
運(yùn)行結(jié)果:
通過(guò)這些日志消息的輸出,我們就可以看到在程序執(zhí)行時(shí)該循環(huán)內(nèi)部發(fā)生的值的變動(dòng)的情況,從打印出的日志文件可以看出,Logging.debug 函數(shù)不僅輸出了我們所監(jiān)控的變量的數(shù)值,并且輸出了該函數(shù)在調(diào)用時(shí)的時(shí)間和單詞 Bebug。
通過(guò)這樣的一個(gè)日志我們就可以非常直觀的看到程序在運(yùn)行過(guò)程中的變化情況。
不要使用print調(diào)試程序
現(xiàn)在我們來(lái)聊一下,為什么不建議使用 print 函數(shù)進(jìn)行值的監(jiān)控輸出,并不是說(shuō) pintf 函數(shù)不能夠?qū)⑽覀儽O(jiān)控的變量值輸出。
而是我們?cè)趯⒊绦蛘{(diào)試完成的時(shí)候,需要花費(fèi)很多時(shí)間從代碼中清除每條日志消息中的 print 函數(shù),這樣的話,我們就很有可能一不小將我們期望輸出的內(nèi)容進(jìn)行刪除。
然而,日志消息就很好地避免了這一點(diǎn),我們可以隨心所欲的在程序中添加很多日志變量。
那可能就會(huì)有小伙伴問(wèn)了,難道使用日志文件輸出的內(nèi)容在最后就不需要禁用了嗎?
當(dāng)然不是的,只是使用 logging.debug 輸出的語(yǔ)句在最后不需要我們一個(gè)個(gè)的將其禁用,只需要調(diào)用 logging.disable(logging.CRITICAL) 就可以完全禁止日志輸出。
不像print函數(shù)那樣必須將每一行刪除或注釋掉,因此 logging.disable 模塊讓日志文件的顯示和隱藏變得更加方便快捷。
哈哈,下一步你可能會(huì)認(rèn)為我要說(shuō) logging.disable 函數(shù)的禁用功能了。
嗯…那接下來(lái)我們就來(lái)說(shuō)一下Python中日志消息的級(jí)別,是不是很驚喜?沒(méi)事,都會(huì)有的喔!
日志級(jí)別
我們所調(diào)用的日志文件是有日志級(jí)別的,“日志級(jí)別”提供了一種方式。
這種方式按重要性將日志消息進(jìn)行了分類,五個(gè)日志級(jí)別如下表所示,從最不重要到最重要,利用不同的日志函數(shù)消息,可以按某個(gè)級(jí)別計(jì)入日志并且輸出。
日志消息作為一個(gè)字符串,傳遞給這些函數(shù),進(jìn)行日志級(jí)別的劃分只是為了方便對(duì)程序中可能出現(xiàn)的錯(cuò)誤的異常判斷,歸根到底,具體使用哪種級(jí)別的日志消息,還是需要根據(jù)你的程序來(lái)定的。
日志級(jí)別的好處就在于,我們可以改變想要看到的日志消息的優(yōu)先級(jí),向 basicConfig 函數(shù)傳入 logging DEBUG 作為 level 的關(guān)鍵字參數(shù),這將顯示所有日志級(jí)別的消息。
同時(shí)在進(jìn)行某項(xiàng)程序開(kāi)發(fā)的時(shí)候我們可能并不希望顯示所有的日志消息,這樣我們可以修改 level 的關(guān)鍵字參數(shù)。
例如:將 basicConfig 函數(shù)的 level 的關(guān)鍵字參數(shù)改為 logging.ERROR,這樣將只顯示 ERROR 級(jí)別和 CRITICAL 的日志消息,對(duì)于 ERROR 以下級(jí)別的日志消息并不會(huì)顯示在屏幕上。
例如下面這行代碼,我們只禁用 INFO 及以下級(jí)別的日志消息,則對(duì)于 INFO 以上的 WARNING 消息則不會(huì)禁用。
#日志禁用
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
#禁用INFO及以下級(jí)別日志消息
logging.disable(logging.INFO)
logging.debug("程序測(cè)試:")
def factorial(n):
logging.debug("階乘數(shù)為:%s" %(n))
result = 1
for i in range(1, n + 1):
result *= i
logging.debug("此時(shí)乘的數(shù)為:%s, 結(jié)果是%s" %(i, result))
logging.warning('最終結(jié)果:%s' %(result))
return result
print(factorial(5))
結(jié)果如下:
好了,聊完日志的級(jí)別,就該禁用日志出場(chǎng)了!
禁用日志
在調(diào)試完成以后,我們當(dāng)然不希望所有這些日志出現(xiàn)在屏幕之上,這時(shí)我們需要調(diào)用 logging.disable 函數(shù)禁用這些消息,這樣這些日志消息就不必進(jìn)入到程序之中手動(dòng)刪除或者將所有日志注釋掉,只需要向 logging.disable 傳入一個(gè)級(jí)別,它就會(huì)禁止該級(jí)別和更低級(jí)的所有日志消息。
所以如果想要禁用所有日志,只需要向程序中添加:
logging.disable(logging.CRITICAL),
同時(shí)還有一點(diǎn)需要注意的是:logging.disable 函數(shù)將禁用它之后的所有該級(jí)別及以下的消息。
所以在這里我們就可以將禁用日志消息的 logging.disable 函數(shù)放在程序文件的最前方,調(diào)用 import logging 模塊之下,這樣就很容易找到,并且根據(jù)需要來(lái)注釋掉,從而啟用或禁用日志消息的作用。
將日志記錄到文件
我們除了將日志消息顯示在屏幕上以外,還可以將它們寫入到文本文件之中,這樣做目的是為了我們?cè)谶M(jìn)行程序調(diào)試的時(shí)候,不至于很多日志文件顯示在屏幕,從而影響我們對(duì)變量的讀取的讀取,在 rogging.basicConfig 函數(shù)接收f(shuō)ilename 關(guān)鍵字為參數(shù),像這樣:
#將日志寫入文件
logging.basicConfig(filename='logginginfo.txt', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
之后日志消息就會(huì)被保存到某一特定的文本文件中,同樣使用求階乘的函數(shù),將日志消息存入 txt 文件中:
這樣程序輸出的結(jié)果中就只會(huì)有我們使用 print 想要輸出的內(nèi)容,對(duì)于日志消息,則會(huì)保存在相應(yīng)的日志文件中去。
雖然日志消息很有用,但如果不存入文件顯示,就可能會(huì)和我們想要輸出的結(jié)果一同顯示在屏幕上,讓我們很難找到程序中真正的輸出。將日志信息寫入到文件以后,這樣就會(huì)使屏幕變得干凈整潔,就能夠很好的保存信息。
這樣在程序運(yùn)行之后,如果發(fā)現(xiàn)某些程序錯(cuò)誤,我們就可以直接在該文本文件中讀取日志,查看變量信息。
版權(quán)聲明:本文為CSDN博主「灰小猿」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/weixin_44985880/article/details/106179998
總結(jié)
以上是生活随笔為你收集整理的python 消息框但不影响程序执行_还在用print()查找错误?日志消息不香嘛?| 原力计划...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: embedv.php_PHP与视频播放插
- 下一篇: python random函数_详细代码