Python之打印日志庫(kù)(logging)
一、日志等級(jí)
級(jí)別 | 何時(shí)使用 |
---|---|
DEBUG | 細(xì)節(jié)信息,僅當(dāng)診斷問(wèn)題時(shí)使用 |
INFO | 確認(rèn)程序按預(yù)期運(yùn)行 |
WARNING | 表明已經(jīng)或即將發(fā)生的意外(例如:磁盤(pán)空間不足)。程序仍按預(yù)期進(jìn)行 |
ERROR | 由于嚴(yán)重的問(wèn)題,程序的某些功能已經(jīng)不能正常執(zhí)行 |
CRITICAL | 嚴(yán)重的錯(cuò)誤,表明程序已不能繼續(xù)執(zhí)行 |
默認(rèn)等級(jí)是“WARNING”,意味著只會(huì)跟蹤該級(jí)別及以上的事件(由上倒下等級(jí)以此遞增),除非更改日志配置。
二、基本用法
1. quick start
>>> import logging >>> logging.warning("warning") WARNING:root:warning >>> logging.info("information") >>>
注意這里只有warning的信息打印出來(lái)了。如前面所說(shuō),默認(rèn)等級(jí)是“WARNING”,只會(huì)追蹤該級(jí)別及以上的事件,所以info信息沒(méi)有被打印出來(lái)。
其中WARNING是記錄級(jí)別;root代表打印的模塊來(lái)源(沒(méi)有顯示設(shè)置,顯然是默認(rèn)值,甚至不是當(dāng)前模塊的名稱);warning就是我們顯示打印的數(shù)據(jù)信息了。
2. 記錄日志到文件
import logging logging.basicConfig(filename='pycode.log', level=logging.DEBUG) logging.warning('warning') logging.info('information') logging.debug('debug')
通過(guò)設(shè)置logging的基本配置可以將記錄重定向到文件中。同時(shí)可以通過(guò)level指定打印級(jí)別。
# pycode.log WARNING:root:warning INFO:root:information DEBUG:root:debug
注意到,此時(shí)在文件中的打印級(jí)別已經(jīng)降為 DEBUG了。該方法也適用在命令行中修改打印級(jí)別。
但有個(gè)需要注意的點(diǎn):對(duì)basicConfig的調(diào)用應(yīng)該在debug(),info()等函數(shù)前面。basicConfig是一次性的配置,只有第一次調(diào)用會(huì)進(jìn)行操作,隨后的調(diào)用不會(huì)產(chǎn)生有效操作。
什么意思呢?
舉個(gè)例子:
>>> import logging >>> logging.warning("123") WARNING:root:123 >>> logging.info("123") # 不會(huì)有輸出 >>> logging.basicConfig(level=logging.DEBUG) >>> logging.info("123") # 依舊不會(huì)有輸出
另一個(gè)例子:
>>> import logging >>> logging.basciConfig(level=loggin.DEBUG) >>> logging.warning("123") WARNING:root:123 >>> logging.info("123") INFO:root:123
在第一次調(diào)用logging.info()、warning()等函數(shù)的時(shí)候,就會(huì)調(diào)用內(nèi)置的basicConfig。此時(shí)就已經(jīng)固化打印級(jí)別為WARNING了,即使后面再次顯式調(diào)用basicConfig也不會(huì)有效。
命令行指定級(jí)別:除了通過(guò)basicConfig設(shè)置level,也可以在執(zhí)行Python程序的時(shí)候,通過(guò)命令行參數(shù)指定。
$ 設(shè)置logging打印級(jí)別為INFO $ python3 pycode.py --log=INFO
追加打印:此外,記錄輸出到文件中,默認(rèn)是追加打印的。如果希望重新記錄,可以這樣:
logging.basicConfig(filename='pycode.log', filemode='w', level=logging.DEBUG)
3. 多模塊打印
# main.py import logging import somelib logging.basicConfig(level=logging.INFO) def main(): logging.info("py01") py02.do_something() if __name__ == '__main__': main() # --------------------------- # somelib.py import logging def do_something(): logging.info("py02")
輸出:
# pycode.log
INFO:root:py01
INFO:root:py02
可以看到,多模塊的信息都能正常打印到日志文件中。但很明顯可以發(fā)現(xiàn)不論是從哪個(gè)模塊輸出,日志記錄中顯示的都是root。所以目前還不能跟蹤記錄打印的模塊來(lái)源。
4. 定義打印格式
前面出現(xiàn)的打印信息基本上是:記錄級(jí)別:模塊來(lái)源:記錄信息
同樣可以在basicConfig中定義打印的格式:
>>> import logging >>> logging.basicConfig(format='%(asctime)s : %(name)s : %(message)s', level=logging.INFO) >>> logging.info("123") 2020-06-19 22:38:16,048 : root : 123
可以看到,此時(shí)展示了打印時(shí)間,模塊來(lái)源及記錄信息。
格式配置屬性:
格式 | 描述 |
---|---|
%(asctime)s | 調(diào)用消息記錄打印時(shí)的時(shí)間(格式化后的時(shí)間) |
%(created)f | 調(diào)用消息記錄打印時(shí)的時(shí)間(未格式化的描述,相當(dāng)于time.time()) |
%(filename)s | 調(diào)用消息記錄打印的文件名稱(在哪個(gè)文件里面) |
%(funcName)s | 調(diào)用消息記錄打印的函數(shù)名稱(在哪個(gè)函數(shù)里面) |
%(levelname)s | 消息記錄級(jí)別(DEBUG,INFO,WARNING,ERROR,CRITICAL) |
%(levelno)s | 消息記錄級(jí)別的數(shù)字號(hào)(DEBUG=10,INFO=20,WARNING=30,ERROR=40,CRITICAL=50) |
%(lineno)d | 調(diào)用消息記錄打印的行數(shù)(在哪一行打印的) |
%(message)s | 待打印的自定義消息 |
%(module)s | 調(diào)用消息記錄的模塊名 |
%(msecs)d | 調(diào)用消息記錄打印時(shí)間的毫秒部分 |
%(name)s | 打印消息的logger對(duì)象名稱(自定義的,默認(rèn)是root) |
%(pathname)s | 調(diào)用消息記錄的文件路徑 |
%(process)d | 進(jìn)程ID |
%(processName)s | 進(jìn)程名 |
%(relativeCreated)d | 相對(duì)logging模塊被加載到打印消息記錄時(shí)的相對(duì)時(shí)間(毫秒) |
%(thread)d | 線程ID |
%(threadName)s | 線程名 |
此時(shí),為了跟蹤打印消息的來(lái)源,我們可以組織一個(gè)這樣的格式串:
# main.py import logging import somelib logging.basicConfig( level=logging.INFO, format="%(asctime)s: %(name)s: %(levelname)s: %(message)s") logger = logging.getLogger("main123") def main(): logger.info("py01") somelib.do_something() if __name__ == '__main__': main() # ------------------------------ # somelib.py import logging logger = logging.getLogger("pylib") def do_something(): logger.info("py02") # ------------------------------ # 輸出 2020-06-19 23:26:27,263: main123: INFO: py01 2020-06-19 23:26:27,264: pylib: INFO: py02
有其他的需求,也可以根據(jù)上面列出來(lái)的屬性自行搭配。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python之tkinter組合框Combobox用法及說(shuō)明
這篇文章主要介紹了Python之tkinter組合框Combobox用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05python實(shí)現(xiàn)LRU熱點(diǎn)緩存及原理
LRU算法根據(jù)數(shù)據(jù)的歷史訪問(wèn)記錄來(lái)進(jìn)行淘汰數(shù)據(jù),其核心思想是“如果數(shù)據(jù)最近被訪問(wèn)過(guò),那么將來(lái)被訪問(wèn)的幾率也更高”。 。這篇文章主要介紹了python實(shí)現(xiàn)LRU熱點(diǎn)緩存,需要的朋友可以參考下2019-10-10Python如何實(shí)現(xiàn)的簡(jiǎn)單購(gòu)物車程序
這篇文章主要介紹了Python如何實(shí)現(xiàn)的簡(jiǎn)單購(gòu)物車程序,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-05-05淺談Keras中fit()和fit_generator()的區(qū)別及其參數(shù)的坑
這篇文章主要介紹了Keras中fit()和fit_generator()的區(qū)別及其參數(shù)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python搭建代理IP池實(shí)現(xiàn)獲取IP的方法
這篇文章主要介紹了Python搭建代理IP池實(shí)現(xiàn)獲取IP的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Django ORM實(shí)現(xiàn)按天獲取數(shù)據(jù)去重求和例子
這篇文章主要介紹了Django ORM實(shí)現(xiàn)按天獲取數(shù)據(jù)去重求和例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05