Python?日志記錄模塊的綜合指南
Python 日志模塊的綜合指南
日志記錄是軟件開發(fā)的一個(gè)重要方面,它允許開發(fā)人員跟蹤和管理應(yīng)用程序的行為。Python 提供了一個(gè)功能強(qiáng)大的日志模塊,可提供靈活和可定制的日志功能。在本文中,我們將深入探討 Python 日志模塊,包括其用法、優(yōu)點(diǎn)和高級(jí)功能。
是什么讓 print 語句變得不倫不類?
print 語句被認(rèn)為不是很 Pythonic,因?yàn)樗鼈兺ǔS糜谂R時(shí)調(diào)試,會(huì)使代碼變得雜亂無章。一旦你調(diào)試完代碼,你就需要返回并刪除所有你寫的 print 語句。相反,Python 鼓勵(lì)使用日志模塊,它可以更好地控制消息、級(jí)別和目的地,同時(shí)有助于保持代碼更整潔、更有條理。
相關(guān)閱讀:Python 的 print 函數(shù)你真的會(huì)用了嗎?
Python 日志級(jí)別
在 Python 的日志模塊中,有多個(gè)日志級(jí)別,每個(gè)級(jí)別都有自己的意義和用例。以下是標(biāo)準(zhǔn)日志級(jí)別及其簡要說明:
• DEBUG:用于診斷問題的詳細(xì)信息,在開發(fā)和調(diào)試過程中使用。
• INFO:確認(rèn)運(yùn)行情況符合預(yù)期;關(guān)于程序執(zhí)行情況的信息。
• WARNING:表示潛在的問題或不一定妨礙程序運(yùn)行的問題。
• ERROR:表示更嚴(yán)重的問題,可能導(dǎo)致程序無法正常運(yùn)行。
• CRITICAL:通常會(huì)導(dǎo)致程序終止的嚴(yán)重錯(cuò)誤;最嚴(yán)重的日志記錄級(jí)別。
開發(fā)人員可以根據(jù)需要定義其他日志記錄級(jí)別,不過現(xiàn)有級(jí)別通常足以應(yīng)對(duì)大多數(shù)情況。每個(gè)內(nèi)置日志記錄級(jí)別都有一個(gè)特定的數(shù)值來表示其重要性。
下面是 Python 日志模塊中關(guān)鍵組件和方法的簡化解釋:
Constants:
• Constants(常量)是代表日志級(jí)別的固定值,如 DEBUG、INFO、WARNING、ERROR 和 CRITICAL。
Classes(類):
• Logger(記錄器):代表日志記錄通道并負(fù)責(zé)發(fā)出日志信息的對(duì)象。
• Handler(處理程序):定義日志信息發(fā)送位置(如控制臺(tái)或文件)的類。
• Filter(過濾器):用于指定應(yīng)根據(jù)特定條件處理哪些日志記錄的類。
Methods(方法):
• logger.info(msg):記錄 INFO 級(jí)別的信息。
• logger.warning(msg):記錄警告級(jí)別的警告信息。
• logger.error(msg):以 ERROR 級(jí)別記錄錯(cuò)誤信息。
• logger.critical(msg):以 CRITICAL 級(jí)別記錄關(guān)鍵信息。
• logger.log(lvl, msg):以自定義整數(shù)日志級(jí)別 (lvl) 記錄一條信息。
• logger.exception(msg):以 ERROR 級(jí)別記錄錯(cuò)誤信息,并包含異常信息。
• logger.setLevel(lvl):設(shè)置此日志記錄器的最小日志級(jí)別(閾值),忽略低于該級(jí)別的消息。
• logger.addFilter(filt):為該日志記錄器添加過濾器,允許對(duì)處理的日志記錄進(jìn)行精細(xì)控制。
• logger.removeFilter(filt):從該日志記錄器中刪除特定過濾器。
• logger.filter(record):將日志記錄應(yīng)用日志記錄器的過濾器,如果應(yīng)予以處理,則返回 True,否則返回 False。
• logger.addHandler(hdlr):為該日志記錄器添加日志處理程序(輸出目標(biāo))。
• logger.removeHandler(hdlr):從該日志記錄器中刪除特定日志處理程序。
• logger.hasHandlers():檢查日志記錄器是否有任何已配置的日志處理程序。
這些方法和概念是 Python 日志模塊的基礎(chǔ),可讓您控制日志級(jí)別、過濾器、處理程序等,以便在應(yīng)用程序中有效記錄日志。
常用的處理程序:
除基本處理程序類外,還提供了許多有用的子類。
• StreamHandler:向控制臺(tái)或類文件對(duì)象發(fā)送消息。
• FileHandler:向磁盤上的文件發(fā)送信息。
• RotatingFileHandler(旋轉(zhuǎn)文件處理程序 向有大小限制和自動(dòng)文件輪換的文件發(fā)送信息。
• TimedRotatingFileHandler:向基于時(shí)間輪換的文件發(fā)送信息。
• SocketHandler:通過網(wǎng)絡(luò)套接字發(fā)送信息。
• DatagramHandler:通過 UDP 套接字發(fā)送信息。
• SMTPHandler:向電子郵件地址發(fā)送信息。
• SysLogHandler:向系統(tǒng)日志守護(hù)進(jìn)程發(fā)送信息。
• NTEventLogHandler:向 Windows 事件日志發(fā)送消息。
• MemoryHandler:在內(nèi)存中緩沖信息,并根據(jù)標(biāo)準(zhǔn)刷新。
• HTTPHandler:向 HTTP 服務(wù)器發(fā)送信息。
• WatchedFileHandler:監(jiān)控并在日志文件發(fā)生變化時(shí)重新打開日志文件。
• QueueHandler:隊(duì)列處理程序:向隊(duì)列發(fā)送消息。
• NullHandler:忽略錯(cuò)誤信息,對(duì)庫開發(fā)人員很有用。
Python 日志基礎(chǔ)知識(shí)
要使用 Python 的日志模塊將事件記錄到文件中,首先要從庫中導(dǎo)入該模塊,而且非常簡單。
通過指定事件記錄的文件名、調(diào)整格式、在追加和寫入模式之間切換、設(shè)置記錄級(jí)別閾值以及從可用選項(xiàng)中自定義屬性來配置記錄器。如示例所示,創(chuàng)建一個(gè)實(shí)例并使用其方法。
記錄變量
這段代碼展示了如何使用 logging.error() 函數(shù)記錄錯(cuò)誤信息,其中包括變量名的空格符 (%s)。
import logging
name = 'Rocky'
logging.error(f'{name} raised an error')
Output:
ERROR:root:Rocky raised an error記錄所有級(jí)別
該代碼顯示了各級(jí)記錄信息。
# 導(dǎo)入日志模塊
import logging
# 創(chuàng)建并配置日志記錄器
logging.basicConfig(filename="newfile.log", # 指定日志文件名
format='%(asctime)s %(message)s', # 定義日志信息格式
filemode='w') # 將文件模式設(shè)置為 "w",以便寫入。
# 創(chuàng)建日志記錄器對(duì)象
logger = logging.getLogger()
# 設(shè)置日志記錄器的閾值為 DEBUG 級(jí)別
logger.setLevel(logging.DEBUG)
# 記錄不同嚴(yán)重程度的測(cè)試信息
logger.debug("A harmless debug message") # 調(diào)試級(jí)別信息
logger.info("Just providing some information") # 信息級(jí)消息
logger.warning("This is a warning") # 警告級(jí)別消息
logger.error("Have you attempted to divide by zero?") # 錯(cuò)誤級(jí)別信息
logger.critical("The internet connection is down") # 嚴(yán)重級(jí)別信息
Output:
DEBUG:root:A harmless debug message
INFO:root:Just providing some information
WARNING:root:This is a warning
ERROR:root:Have you attempted to divide by zero?
CRITICAL:root:The internet connection is down提供日志配置的另一種表示方法。
file name : temp.conf [loggers] keys=root,simpleExample [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
所提供的代碼利用 "temp.conf "配置文件中指定的設(shè)置來初始化日志系統(tǒng)。然后創(chuàng)建一個(gè)名為 "simpleExample "的日志記錄器,并使用一系列日志級(jí)別記錄信息。
import logging
import logging.config
logging.config.fileConfig('temp.conf')
logger = logging.getLogger('simpleExample')
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
Output:
2023-09-01 13:04:35,581 - simpleExample - DEBUG - debug message
2023-09-01 13:04:35,581 - simpleExample - INFO - info message
2023-09-01 13:04:35,581 - simpleExample - WARNING - warn message
2023-09-01 13:04:35,581 - simpleExample - ERROR - error message
2023-09-01 13:04:35,582 - simpleExample - CRITICAL - critical messagePython 日志異常
在日志記錄過程中使用異常,可以在特定情況下提示應(yīng)用程序中的異常情況或錯(cuò)誤,從而達(dá)到有價(jià)值的目的。當(dāng)異常發(fā)生時(shí),它就像一面紅旗,會(huì)打斷正常的程序流程,并告知調(diào)用者或日志系統(tǒng)所遇到的問題。
import logging
# 配置日志系統(tǒng)
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')
# 定義對(duì)給定值執(zhí)行操作的函數(shù)
def perform_operation(value):
if value < 0:
raise ValueError("Invalid value: The value cannot be negative.")
else:
logging.info("Operation completed successfully.")
try:
input_value = int(input("Please input a numerical value: "))
perform_operation(input_value)
except ValueError as ve:
logging.exception("An exception occurred: %s", str(ve))
Output:
Please input a numerical value:
-6
ERROR:root:An exception occurred: Invalid value: The value cannot be negative.
Traceback (most recent call last):
File "<ipython-input-15-d0b160f9076e>", line 21, in <cell line: 16>
perform_operation(input_value)
File "<ipython-input-15-d0b160f9076e>", line 11, in perform_operation
raise ValueError("Invalid value: The value cannot be negative.")
ValueError: Invalid value: The value cannot be negative.這樣就可以記錄系統(tǒng)的工作情況,隨后進(jìn)行分析。不過,為了防止文件過大,必須不斷更新文件。
以上就是Python 日志記錄模塊的綜合指南的詳細(xì)內(nèi)容,更多關(guān)于Python 日志記錄模塊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Django JSonResponse對(duì)象的實(shí)現(xiàn)
本文主要介紹了Django JSonResponse對(duì)象的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Python命令啟動(dòng)Web服務(wù)器實(shí)例詳解
這篇文章主要介紹了Python命令啟動(dòng)Web服務(wù)器實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02
Pytorch實(shí)現(xiàn)將模型的所有參數(shù)的梯度清0
這篇文章主要介紹了Pytorch實(shí)現(xiàn)將模型的所有參數(shù)的梯度清0,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python?Conda安裝包報(bào)錯(cuò):PackagesNotFoundError兩種解決方法
這篇文章主要給大家介紹了關(guān)于Python?Conda安裝包報(bào)錯(cuò):PackagesNotFoundError的兩種解決方法,這通常意味著安裝程序正在尋找的環(huán)境包沒有在 conda 的默認(rèn)通道中找到,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
Python上級(jí)目錄文件導(dǎo)入的幾種方法(from.import)
有時(shí)候我們可能需要import另一個(gè)路徑下的python文件,下面這篇文章主要給大家介紹了關(guān)于Python上級(jí)目錄文件導(dǎo)入的幾種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
python數(shù)據(jù)分析必會(huì)的Pandas技巧匯總
用Python做數(shù)據(jù)分析光是掌握numpy和matplotlib可不夠,numpy雖然能夠幫我們處理處理數(shù)值型數(shù)據(jù),但很多時(shí)候,還有字符串,還有時(shí)間序列等,比如:我們通過爬蟲獲取到了存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù),一些Pandas必會(huì)的用法,讓你的數(shù)據(jù)分析水平更上一層樓2021-08-08
python爬蟲學(xué)習(xí)筆記--BeautifulSoup4庫的使用詳解
這篇文章主要介紹了Python中使用Beautiful Soup庫的超詳細(xì)教程,示例代碼基于Python2.x版本,極力推薦!需要的朋友可以參考下2021-08-08

