python關(guān)于第三方日志的QA記錄詳解
Q:python 查看當(dāng)前的日志級(jí)別
A:在 Python 中,你可以使用 logging 模塊來查看當(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í)別,并將其打印出來。然后,通過 setLevel() 方法設(shè)置了一個(gè)新的日志級(jí)別(在實(shí)際應(yīng)用中,你可能不需要設(shè)置級(jí)別,這只是為了演示目的)。最后,再次獲取當(dāng)前的日志級(jí)別并打印出來。
請(qǐng)注意,getEffectiveLevel() 返回的是數(shù)值,你可以使用 logging 模塊中定義的常量(如 logging.DEBUG、logging.INFO 等)來比較這些值,以便更容易理解日志級(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ì)的日志信息,你可以通過調(diào)整日志級(jí)別來設(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)輸出。然后,我們可以通過 logger.addHandler(stream_handler) 將這個(gè)處理器添加到日志記錄器中。最后,我們通過 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,則日志中將不包含異常信息。
注意:通常,將異常信息記錄到日志中可以幫助你在排查問題時(shí)更容易找到出錯(cuò)的地方,但要謹(jǐn)慎使用,尤其是在生產(chǎn)環(huán)境中,因?yàn)樵敿?xì)的異常信息可能包含敏感信息。
Q: 如何刪除所有 logger 的 所有 Handler
A: 如果你想要?jiǎng)h除所有 logger 的所有 handler,可以通過以下方式實(shí)現(xiàn):
import logging
# 獲取所有已經(jīng)存在的 logger 名稱
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 名稱,然后遍歷每個(gè) logger,并刪除其所有 handler。在刪除 handler 之后,還調(diào)用了 handler.close() 來關(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 屬性來獲取所有已創(chuàng)建的 logger 對(duì)象的名稱。這可以通過以下方式實(shí)現(xiàn):
import logging
# 獲取所有已經(jīng)存在的 logger 名稱
existing_loggers = logging.Logger.manager.loggerDict.keys()
# 打印所有 logger 的名稱
for logger_name in existing_loggers:
print(logger_name)上述代碼首先獲取了 Logger.manager.loggerDict 中的所有鍵,每個(gè)鍵都是一個(gè) logger 對(duì)象的名稱。然后,通過循環(huán)遍歷這些鍵,即 logger 名稱,并打印出來。
需要注意的是,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ì)象本身,而不僅僅是名稱,你可以使用 logging.getLogger(logger_name) 方法:
import logging
# 獲取所有已經(jīng)存在的 logger 名稱
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進(jìn)階之切片的誤區(qū)與高級(jí)用法
python區(qū)塊鏈簡(jiǎn)易版交易實(shí)現(xiàn)示例
Python 3.8中實(shí)現(xiàn)functools.cached_property功能
使用Python對(duì)IP進(jìn)行轉(zhuǎn)換的一些操作技巧小結(jié)
Pandas執(zhí)行SQL操作的實(shí)現(xiàn)
基于python + django + whoosh + jieba 分詞器實(shí)現(xiàn)站內(nèi)檢索功能
利用python和百度地圖API實(shí)現(xiàn)數(shù)據(jù)地圖標(biāo)注的方法

