python模塊-比print更好用的logging

文章參考:logging模塊解讀

適用目的:

代碼通常經(jīng)過開發(fā)、調(diào)試、審查、測試或者上線等不同階段。
在每個(gè)階段中不僅需要查看報(bào)錯(cuò)的信息,也需要查閱調(diào)試相關(guān)的信息,人的大腦不能直接解讀代碼,則需要利用 print() 函數(shù) 打印出想要的信息觀察。
這時(shí)候 logging模塊 更為適合。

因?yàn)楫?dāng)不斷使用print打印出變化過程,會(huì)使得代碼容易錯(cuò)亂及冗雜,無法區(qū)分是本身需要print的內(nèi)容還是單純?yōu)榱瞬榭醋兓^程。

logging模塊作用:

1.控制信息層級(jí)
2.控制顯示時(shí)機(jī)(一般與try...except搭配使用)
3.內(nèi)置信息模塊
4.知曉來源的py文件

簡單例子:

import logging
logging.basicConfig(level=logging.INFO) #不開啟不打印,只有warnning的才會(huì)打印,否則得basicconfig設(shè)置

def hypotenuse(a, b):
    """計(jì)算三角形斜邊"""
    return (a**2 + b**2)**0.5

logging.info("{a},  的斜邊是 {c}".format(a=3, b=4, c=hypotenuse(a=3, b=4)))
#打印出的日志信息遵循默認(rèn)格式: {LEVEL}:{LOGGER}:{MESSAGE}。
INFO:root:3, 4 的斜邊是 5.0

個(gè)人認(rèn)為,只需要掌握:
logging.basicConfig配置、logging.{level}調(diào)用、logger.getLogger(name) 三個(gè)函數(shù)的使用方式即可,其余內(nèi)容遇到時(shí)進(jìn)行搜索即可。

案例

import logging
logging.basicConfig(level=logging.ERROR) #只有Error以上的部分才打印

def hypotenuse(a, b):
    """計(jì)算三角形斜邊"""
    return (a**2 + b**2)**0.5

kwargs = {'a':3, 'b':4, 'c':hypotenuse(3, 4)}

logging.debug("a = {a}, b = ".format(**kwargs))
logging.info("{a},  的斜邊是 {c}".format(**kwargs))
logging.warning("a={a} 和 b= 相等".format(**kwargs))
logging.error("a={a} 和 b= 不能為負(fù)".format(**kwargs),exc_info=True)
logging.critical("{a},  的斜邊是 {c}".format(**kwargs))
ERROR:root:a=3 和 b=4 不能為負(fù)
NoneType: None
CRITICAL:root:3, 4 的斜邊是 5.0

首先有2個(gè)知識(shí)點(diǎn)需要掌握:
1.level和basicConfig的作用
2.logging輸出的格式及調(diào)用

(1)level和basicConfig的作用

level等級(jí)
logging 有 5 個(gè)不同層次的日志級(jí)別,可以將給定的 logger 配置為這些級(jí)別:
1. DEBUG:詳細(xì)信息,用于診斷問題。Value=10。
2. INFO:確認(rèn)代碼運(yùn)行正常。Value=20。
3. WARNING:意想不到的事情發(fā)生了,或預(yù)示著某個(gè)問題。但軟件仍按預(yù)期運(yùn)行。Value=30。
4. ERROR:出現(xiàn)更嚴(yán)重的問題,軟件無法執(zhí)行某些功能。Value=40。
5. CRITICAL:嚴(yán)重錯(cuò)誤,程序本身可能無法繼續(xù)運(yùn)行。Value=50。

簡單地說:即有5個(gè)等級(jí)隨你分層,在basicConfig設(shè)置默認(rèn)的level等級(jí)是WARNING,根據(jù)設(shè)置的等級(jí)來顯示同等級(jí)別及更高級(jí)別的信息。
注意觀察實(shí)例代碼,設(shè)置logging.basicConfig(level=logging.ERROR),所以只有

logging.error("a={a} 和 b= 不能為負(fù)".format(**kwargs),exc_info=True)
logging.critical("{a},  的斜邊是 {c}".format(**kwargs))

這兩條信息打印出來

將日志記入文件
將日志消息發(fā)送到文件,需要在 logging.basicConfig() 中設(shè)置 file 參數(shù):

import logging
logging.basicConfig(level=logging.INFO, filename='sample.log')

現(xiàn)在,所有后續(xù)日志消息都將直接記錄到當(dāng)前工作目錄中的“sample.log“文件。如果要將其記錄到另一個(gè)目錄中的文件,請(qǐng)給出完整的文件路徑。


image.png
(2)logging輸出的格式及調(diào)用
CRITICAL:root:3, 4 的斜邊是 5.0

觀察上面的代碼結(jié)果,你會(huì)發(fā)現(xiàn)打印的日志格式默認(rèn)遵循:
{LEVEL}:{LOGGER}:{MESSAGE}
LEVEL = 'CRITICAL'
LOGGER = 'root'
MESSAGE = '3, 4 的斜邊是 5.0'

如何調(diào)用

logging.critical("{a},  的斜邊是 {c}".format(**kwargs))

從結(jié)果追溯調(diào)用,logging.{level}(message)調(diào)用了這條信息。(注意小寫)

當(dāng)多個(gè)py文件結(jié)合使用

# 1. myprojectmodule.py
import logging
logging.basicConfig(filename='module.log')

#-----------------------------

# 2. main.py (從 myprojectmodule.py 導(dǎo)入代碼)
import logging
import myprojectmodule  # 運(yùn)行 myprojectmodule.py 中的代碼,將生成 `module.log` 文件

logging.basicConfig(filename='main.log')  # 無效!

如果項(xiàng)目中有一個(gè)或多個(gè)模塊。這些模塊使用基本根模塊。然后,當(dāng)導(dǎo)入模塊 myprojectmodule.py 時(shí),將運(yùn)行該模塊的所有代碼并配置logger
一旦配置好,main 文件中的 root logger 將不能再更改 root logger 設(shè)置。因?yàn)?,一旦設(shè)置好 logging.basicConfig(),就不能再更改它。
如果想在不同文件中使用不同 logger,就需要?jiǎng)?chuàng)建一個(gè)新的 logger。

如何創(chuàng)建一個(gè)新的 logger?
使用 logging.getLogger(name) 方法創(chuàng)建一個(gè)新的 logger。如果存在同名的 logger,則將使用該 logger。

test = logging.getLogger('test123')

def hypotenuse(a, b):
    """計(jì)算三角形斜邊"""
    return (a**2 + b**2)**0.5

kwargs = {'a':3, 'b':4, 'c':hypotenuse(3, 4)}

test.debug("a = {a}, b = ".format(**kwargs))
test.info("{a},  的斜邊是 {c}".format(**kwargs))
test.warning("a={a} 和 b= 相等".format(**kwargs))
test.error("a={a} 和 b= 不能為負(fù)".format(**kwargs))
INFO:test123:3, 4 的斜邊是 5.0
WARNING:test123:a=3 和 b=4 相等
ERROR:test123:a=3 和 b=4 不能為負(fù)

注意觀察如何調(diào)用及結(jié)果顯示的logger名,會(huì)發(fā)現(xiàn)test.{level}進(jìn)行了調(diào)用,logger顯示的是test123

總結(jié)

總結(jié)一下,嘗試是否記住3個(gè)內(nèi)容。
1.配置
2.調(diào)用
3.切換logger

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容