文章參考: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)給出完整的文件路徑。

(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