python關(guān)于第三方日志的QA記錄詳解
Q:python 查看當(dāng)前的日志級(jí)別
A:在 Python 中,你可以使用 logging
模塊來(lái)查看當(dāng)前的日志級(jí)別。logging
模塊提供了一個(gè)全局的日志系統(tǒng),它包含了各種配置和方法,允許你控制日志的輸出。
以下是一個(gè)簡(jiǎn)單的例子,演示如何查看當(dāng)前的日志級(jí)別:
import logging # 獲取根日志記錄器 logger = logging.getLogger() # 獲取當(dāng)前的日志級(jí)別 current_log_level = logger.getEffectiveLevel() # 輸出當(dāng)前的日志級(jí)別 print(f"Current log level: {current_log_level}") # 設(shè)置一個(gè)日志級(jí)別(僅用于演示,你可能不需要設(shè)置級(jí)別) logger.setLevel(logging.DEBUG) # 再次獲取當(dāng)前的日志級(jí)別 current_log_level = logger.getEffectiveLevel() # 輸出更新后的日志級(jí)別 print(f"Updated log level: {current_log_level}")
在這個(gè)例子中,首先使用 getEffectiveLevel()
方法獲取當(dāng)前的日志級(jí)別,并將其打印出來(lái)。然后,通過(guò) setLevel()
方法設(shè)置了一個(gè)新的日志級(jí)別(在實(shí)際應(yīng)用中,你可能不需要設(shè)置級(jí)別,這只是為了演示目的)。最后,再次獲取當(dāng)前的日志級(jí)別并打印出來(lái)。
請(qǐng)注意,getEffectiveLevel()
返回的是數(shù)值,你可以使用 logging
模塊中定義的常量(如 logging.DEBUG
、logging.INFO
等)來(lái)比較這些值,以便更容易理解日志級(jí)別。
Q:輸出值是 30,表示什么?
A: 在 Python 的 logging
模塊中,日志級(jí)別使用整數(shù)值表示,這些整數(shù)值對(duì)應(yīng)于預(yù)定義的幾個(gè)常量。這些整數(shù)值反映了一個(gè)日志消息的優(yōu)先級(jí),從最低級(jí)別的 DEBUG
到最高級(jí)別的 CRITICAL
。
下面是一些常用的日志級(jí)別和它們對(duì)應(yīng)的整數(shù)值:
CRITICAL
: 50ERROR
: 40WARNING
(或WARN
): 30INFO
: 20DEBUG
: 10NOTSET
: 0
在你的代碼中,如果 logger.getEffectiveLevel()
返回值為 30,表示當(dāng)前的日志級(jí)別為 WARNING
。這意味著只有 WARNING
、ERROR
和 CRITICAL
級(jí)別的日志消息會(huì)被記錄,而 INFO
和 DEBUG
級(jí)別的消息將被忽略。
如果你想要輸出更詳細(xì)的日志信息,你可以通過(guò)調(diào)整日志級(jí)別來(lái)設(shè)置為更低的值。例如,使用 logger.setLevel(logging.DEBUG)
將會(huì)啟用 DEBUG
級(jí)別及以上的所有日志消息。
Q: 怎么讓 logger 輸出到標(biāo)準(zhǔn)輸出
A: 在 Python 的 logging
模塊中,日志可以配置為輸出到不同的地方,其中之一是標(biāo)準(zhǔn)輸出。通常,如果你想將日志輸出到標(biāo)準(zhǔn)輸出,你可以進(jìn)行以下配置:
import logging # 獲取根日志記錄器 logger = logging.getLogger() # 創(chuàng)建一個(gè) StreamHandler,用于將日志輸出到標(biāo)準(zhǔn)輸出 stream_handler = logging.StreamHandler() # 創(chuàng)建一個(gè)格式化器,可選,根據(jù)需要進(jìn)行配置 formatter = logging.Formatter('%(levelname)s - %(message)s') stream_handler.setFormatter(formatter) # 將 StreamHandler 添加到日志記錄器中 logger.addHandler(stream_handler) # 設(shè)置日志級(jí)別,可選,根據(jù)需要進(jìn)行配置 logger.setLevel(logging.DEBUG) # 之后的日志消息將會(huì)輸出到標(biāo)準(zhǔn)輸出 logger.debug("This is a debug message.") logger.info("This is an info message.") logger.warning("This is a warning message.") logger.error("This is an error message.")
在上面的例子中,我們使用 logging.StreamHandler()
創(chuàng)建了一個(gè)處理器,該處理器將日志消息發(fā)送到標(biāo)準(zhǔn)輸出。然后,我們可以通過(guò) logger.addHandler(stream_handler)
將這個(gè)處理器添加到日志記錄器中。最后,我們通過(guò) logger.setLevel(logging.DEBUG)
設(shè)置了日志級(jí)別,以確保低于指定級(jí)別的日志消息不會(huì)被輸出。
請(qǐng)注意,這只是一個(gè)基本的配置示例,你可以根據(jù)實(shí)際需求對(duì)格式、級(jí)別等進(jìn)行調(diào)整。
Q: logger.warning 的 exc_info 參數(shù)是干嘛的
A: exc_info
是 logger.warning
等級(jí)函數(shù)中的一個(gè)可選參數(shù),用于指定是否將異常信息記錄到日志中。當(dāng)你使用 logger.warning
記錄一條日志,并且在該日志消息中包含了異常信息,exc_info
參數(shù)可以控制是否在日志中包含詳細(xì)的異常信息(traceback)。
以下是 logger.warning
函數(shù)的簽名:
Logger.warning(msg, *args, exc_info=False, **kwargs)
msg
: 要記錄的日志消息,可以包含格式化字符串。*args
: 用于格式化字符串的參數(shù)。exc_info
: 一個(gè)布爾值,如果為True
,則將異常信息(traceback)包含在日志中。如果為False
(默認(rèn)),則不包含異常信息。**kwargs
: 其他可選的參數(shù),例如extra
、stack_info
等。
示例使用:
import logging # 獲取根日志記錄器 logger = logging.getLogger() try: # 一些可能引發(fā)異常的代碼 result = 1 / 0 except Exception as e: # 記錄警告級(jí)別的日志,并將異常信息包含在日志中 logger.warning("An error occurred: %s", e, exc_info=True)
在這個(gè)例子中,exc_info=True
將導(dǎo)致日志中包含詳細(xì)的異常信息,包括 traceback。如果省略 exc_info
參數(shù)或?qū)⑵湓O(shè)置為 False
,則日志中將不包含異常信息。
注意:通常,將異常信息記錄到日志中可以幫助你在排查問(wèn)題時(shí)更容易找到出錯(cuò)的地方,但要謹(jǐn)慎使用,尤其是在生產(chǎn)環(huán)境中,因?yàn)樵敿?xì)的異常信息可能包含敏感信息。
Q: 如何刪除所有 logger 的 所有 Handler
A: 如果你想要?jiǎng)h除所有 logger 的所有 handler,可以通過(guò)以下方式實(shí)現(xiàn):
import logging # 獲取所有已經(jīng)存在的 logger 名稱(chēng) existing_loggers = logging.Logger.manager.loggerDict.keys() # 遍歷每個(gè) logger,并刪除其所有 handler for logger_name in existing_loggers: logger = logging.getLogger(logger_name) handlers = logger.handlers[:] for handler in handlers: logger.removeHandler(handler) handler.close()
這段代碼首先獲取了所有已經(jīng)存在的 logger 名稱(chēng),然后遍歷每個(gè) logger,并刪除其所有 handler。在刪除 handler 之后,還調(diào)用了 handler.close()
來(lái)關(guān)閉每個(gè) handler,釋放可能被占用的資源。
請(qǐng)注意,這會(huì)刪除所有 logger 的 handler,包括你之前可能設(shè)置的一些配置。如果你只想刪除根 logger 的 handler,可以使用以下代碼:
import logging # 獲取根 logger logger = logging.getLogger() # 獲取根 logger 的所有 handler handlers = logger.handlers[:] # 遍歷每個(gè) handler 并刪除 for handler in handlers: logger.removeHandler(handler) handler.close()
這樣只會(huì)刪除根 logger 的 handler,而不會(huì)影響其他 logger。如果你之前設(shè)置了其他 logger 的 handler,它們將不受影響。
Q:python 查看所有 logger
A: 你可以使用 logging
模塊的 Logger.manager
屬性來(lái)獲取所有已創(chuàng)建的 logger 對(duì)象的名稱(chēng)。這可以通過(guò)以下方式實(shí)現(xiàn):
import logging # 獲取所有已經(jīng)存在的 logger 名稱(chēng) existing_loggers = logging.Logger.manager.loggerDict.keys() # 打印所有 logger 的名稱(chēng) for logger_name in existing_loggers: print(logger_name)
上述代碼首先獲取了 Logger.manager.loggerDict
中的所有鍵,每個(gè)鍵都是一個(gè) logger 對(duì)象的名稱(chēng)。然后,通過(guò)循環(huán)遍歷這些鍵,即 logger 名稱(chēng),并打印出來(lái)。
需要注意的是,Logger.manager
是 logging
模塊的一個(gè)全局變量,用于管理所有的 logger 對(duì)象。這個(gè)方法僅能獲取在當(dāng)前運(yùn)行時(shí)已經(jīng)創(chuàng)建的 logger,如果你在后續(xù)代碼中創(chuàng)建了新的 logger,它們也會(huì)被包括在內(nèi)。
如果你想獲取每個(gè) logger 對(duì)象本身,而不僅僅是名稱(chēng),你可以使用 logging.getLogger(logger_name)
方法:
import logging # 獲取所有已經(jīng)存在的 logger 名稱(chēng) existing_loggers = logging.Logger.manager.loggerDict.keys() # 獲取每個(gè) logger 對(duì)象本身 loggers = [logging.getLogger(logger_name) for logger_name in existing_loggers] # 打印每個(gè) logger 對(duì)象 for logger in loggers: print(logger)
這樣,你就可以獲取到所有已創(chuàng)建的 logger 對(duì)象。
以上就是python關(guān)于第三方日志的QA記錄詳解的詳細(xì)內(nèi)容,更多關(guān)于python第三方日志QA記錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python數(shù)字類(lèi)型math庫(kù)原理解析
這篇文章主要介紹了python數(shù)字類(lèi)型math庫(kù)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03python之while循環(huán)、無(wú)限循環(huán)用法及說(shuō)明
這篇文章主要介紹了python之while循環(huán)、無(wú)限循環(huán)用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Python虛擬環(huán)境virtualenv安裝的詳細(xì)教程保姆級(jí)(Windows和linux)
本文詳細(xì)介紹了如何在Linux和Windows系統(tǒng)上安裝和配置virtualenv虛擬環(huán)境,包括依賴包安裝、系統(tǒng)環(huán)境變量設(shè)置、激活和退出環(huán)境,以及在PyCharm中的應(yīng)用和導(dǎo)出依賴文件,需要的朋友可以參考下2024-09-09關(guān)于python變量的引用以及在底層存儲(chǔ)原理
Python的變量,簡(jiǎn)單來(lái)說(shuō)有數(shù)值型,布爾型,字符串類(lèi)型,列表,元組,字典等6大類(lèi)。那么不同變量類(lèi)型在底層是如何存儲(chǔ)的,關(guān)系到變量的引用,能否正確的掌握變量的相關(guān)操作?接下來(lái)小編就來(lái)為大家講解python變量的引用以及在底層存儲(chǔ)原理,需要的朋友可以參考一下2021-09-09python中單例常用的幾種實(shí)現(xiàn)方法總結(jié)
Python 的模塊就是天然的單例模式,下面這篇文章主要給大家介紹了關(guān)于python中單例常用的幾種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python單例具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們一起來(lái)看看吧2018-10-10Python+Kepler.gl實(shí)現(xiàn)時(shí)間輪播地圖過(guò)程解析
這篇文章主要介紹了Python+Kepler.gl實(shí)現(xiàn)時(shí)間輪播地圖過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07python基于plotly實(shí)現(xiàn)畫(huà)餅狀圖代碼實(shí)例
這篇文章主要介紹了python基于plotly實(shí)現(xiàn)畫(huà)餅狀圖代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12