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