Python日志模塊Logging使用指北(最新推薦)
Logging模塊是Python中一個很重要的日志模塊,它提供了靈活的日志記錄功能,廣泛應(yīng)用于調(diào)試、運行狀態(tài)監(jiān)控、錯誤追蹤以及系統(tǒng)運維中。相比于簡單的print()打印調(diào)試,Logging支持不同的日志級別(如DEBUG、INFO、WARNING、ERROR和CRITICAL),可將日志輸出到不同位置(如控制臺、文件、網(wǎng)絡(luò)等),還能自定義日志格式和處理方式,從而更好地滿足實際項目中的日志管理需求。
相信各位小伙伴在平時比賽或者項目中寫Python代碼的時候,肯定會遇到代碼出現(xiàn)莫名其妙的報錯,而我們一時半會無法快速定位到問題出在哪里。這時候,相信很多同學(xué)都會使用 print() 函數(shù)在代碼的不同地方插入打印輸出來不斷調(diào)試、縮小問題范圍。雖然這種方式簡單粗暴,在小項目或調(diào)試時確實能派上用場,但隨著項目復(fù)雜度的提高,print()調(diào)試法就顯得力不從心了。比如,你可能想?yún)^(qū)分調(diào)試信息和錯誤信息,或者只在生產(chǎn)環(huán)境中輸出關(guān)鍵日志,還可能需要將日志寫入文件供后續(xù)分析抑或是在找到問題之后還需手動刪除各處的調(diào)試 print() 函數(shù),這不僅麻煩,而且很容易遺漏,甚至可能將調(diào)試信息帶到線上環(huán)境,造成信息泄露或日志污染。
因此,學(xué)會使用專業(yè)的日志工具顯得尤為重要。在Python中,logging 模塊正是官方推薦用于記錄日志的強大工具。它不僅支持不同的日志等級(如 DEBUG、INFO、WARNING、ERROR、CRITICAL),還允許我們將日志靈活地輸出到控制臺、文件,甚至遠程服務(wù)器。此外,logging 還支持自定義日志格式和多種處理器組合,能很好地適配各種復(fù)雜應(yīng)用場景。接下來,我們就從最基礎(chǔ)的用法入手,帶你一步步掌握 logging 模塊的強大功能,寫出更專業(yè)、更易維護的Python代碼?。?!
首先我們要知道,在Logging模塊中日志根據(jù)作用以及重要程度從小到大依次被分為了如下五個等級,具體如下表:
| 日志等級(level) | 描述 |
|---|---|
| DEBUG | 調(diào)試信息,通常在診斷問題的時候使用 |
| INFO | 普通信息,確認程序按照預(yù)期運行 |
| WARNING | 警告信息,表示發(fā)生意想不到的事,或者指示接下來可能會出現(xiàn)一些問題,但是程序還是繼續(xù)運行 |
| ERROR | 錯誤信息,程序運行中出現(xiàn)了一些問題,程序某些功能可能不能執(zhí)行 |
| CRITICAL | 危險信息,一個嚴重的錯誤,導(dǎo)致程序無法繼續(xù)運行 |
知道了這些,那我們具體該如何在代碼中實現(xiàn)日志管理呢?我們接著往下講,首先我們肯定是要在代碼中導(dǎo)入我們的logging模塊,這個模塊是Python內(nèi)置的,無需額外安裝,接著我們要引入logging模塊中的basicConfig函數(shù),這個是配置日志系統(tǒng)最常用、最簡單的一種方式,我們可以通過它來設(shè)置最低顯示的日志等級、日志的顯示格式、日志輸出位置(默認是終端)以及寫入文件的文件名和編碼,接著我們結(jié)合示例來給大家演示一下:
- 最低顯示的日志等級:
從下面的代碼中我們可以看到,我們可以使用level參數(shù)來設(shè)置日志的最低顯示的等級,而當我們在basicConfig中將最低顯示的日志等級level設(shè)置為WARNING的時候,只有大于 WARNING的消息才會被顯示出來
import logging
logging.basicConfig(
level=logging.WARNING,
)
logging.debug("This is a debug message")
logging.info("This is an info message")
logging.warning("This is a warning message")
logging.error("This is an error message")
logging.critical("This is a critical message")
- 日志的顯示格式:
除了設(shè)置最低顯示的日志等級之外,我們還可以使用format參數(shù)來對我們的日志顯示格式進行設(shè)置,format有很多可供選擇的占位符,具體的見下表:
| format占位符 | 含義說明 |
|---|---|
%(asctime)s | 日志事件發(fā)生的時間(默認格式可自定義) |
%(levelname)s | 日志級別名稱(如 INFO、DEBUG 等) |
%(message)s | 日志內(nèi)容主體(你傳入的日志消息) |
%(name)s | 日志器的名稱(Logger對象的名字) |
%(filename)s | 當前執(zhí)行代碼的文件名 |
%(funcName)s | 調(diào)用日志輸出函數(shù)的函數(shù)名 |
%(lineno)d | 輸出日志的代碼行號 |
%(pathname)s | 當前執(zhí)行代碼的完整路徑 |
%(module)s | 模塊名 |
%(threadName)s | 線程名稱(在多線程應(yīng)用中常用) |
%(process)d | 進程 ID(在多進程應(yīng)用中常用) |
import logging
logging.basicConfig(
level=logging.WARNING,
format="時間:%(asctime)s-日志名稱:%(name)s-日志級別:%(levelname)s-日志信息:%(message)s-文件名:%(filename)s-行號:%(lineno)d"
)
logging.debug("This is a debug message")
logging.info("This is an info message")
logging.warning("This is a warning message")
logging.error("This is an error message")
logging.critical("This is a critical message")
- 日志輸出位置:
除了將日志信息打印到終端(默認行為)以外,我們還可以通過 filename 參數(shù)將日志寫入到指定的文件中。這樣一來,我們就可以保存程序運行過程中的所有重要信息,便于后續(xù)排查問題或?qū)ο到y(tǒng)進行日志分析。 我們還可以指定文件的編碼方式,比如使用 utf-8,以避免中文亂碼等問題。下面我們通過一個示例將日志寫入文件中:
import logging
logging.basicConfig(
level=logging.WARNING,
format = '[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s',
filename='my_log.log',
encoding="utf-8"
)
logging.debug("This is a debug message")
logging.info("This is an info message")
logging.warning("This is a warning message")
logging.error("This is an error message")
logging.critical("This is a critical message") 可以看到,運行了這段代碼之后終端沒有輸出了,而在同路徑下生成了一個我們指定的my_log.log文件,這個文件里就有我們需要的日志輸出


如果想每次運行都重新生成日志文件,我們可以繼續(xù)加上 filemode='w' 參數(shù)
import logging
logging.basicConfig(
level=logging.WARNING,
format = '[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s',
filename='my_log.log',
encoding="utf-8",
filemode='w'
)
logging.debug("This is a debug message")
logging.info("This is an info message")
logging.warning("This is a warning message")
logging.error("This is an error message")
logging.critical("This is a critical message") 除此之外,我們也可以給當前的日志信息“命個名”,這在大型項目中非常有用!只需要通過 logging.getLogger("名字") 來創(chuàng)建一個具名 Logger,你可以根據(jù)模塊、功能、組件的不同給它們起不同的名字,這樣日志輸出的時候就能快速定位日志是從哪個部分打印出來的,非常適合團隊協(xié)作和大型工程的調(diào)試分析。
import logging
logging.basicConfig(
level=logging.WARNING,
format = '[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s',
)
logger = logging.getLogger("example")
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")
logger.critical("This is a critical message")
但是有同學(xué)就要問了:“哥們哥們,如果我既想讓日志在終端顯示,又想把日志寫進文件保存下來,該怎么辦呢?”這個問題非常常見!實際上,basicConfig 方式雖然簡單方便,但它本質(zhì)上是對根日志器(root logger)做一次性配置的,不支持同時配置多個輸出目標(Handler)。也就是說,如果你想實現(xiàn)“同時輸出到終端和文件”,就需要用更靈活的方式——自定義 Logger + Handler + Formatter 的組合配置!
而Handler 是什么呢?Handler 是 logging 模塊中的一個核心概念,它負責將日志消息輸出到指定的目標,如控制臺、文件、網(wǎng)絡(luò)等。而 Formatter 則負責定義輸出日志的格式。通過組合 Logger、Handler 和 Formatter,我們能夠更加靈活地控制日志的輸出方式和格式。我們可以用下圖來進行理解

具體的示例如下,我們首先創(chuàng)建一個 logger 對象,并通過 getLogger 方法為其指定一個名稱(在這里是 "example_logger")。接著,我們使用 setLevel 方法設(shè)置日志的最低輸出級別為 DEBUG,這樣所有級別(包括 DEBUG、INFO、WARNING、ERROR 和 CRITICAL)的日志都能被處理。然后,我們創(chuàng)建了兩個 Handler:一個是 StreamHandler,用于將日志輸出到控制臺;另一個是 FileHandler,用于將日志寫入名為 logfile.log 的文件。接著,我們使用 Formatter 設(shè)置日志輸出的格式,包括日志器名稱、日志時間、日志級別和日志信息,最后將這個 Formatter 配置應(yīng)用到兩個 Handler 上。最后,通過 addHandler 方法將這兩個 Handler 添加到 logger 中,這樣我們就能實現(xiàn)同時將日志輸出到控制臺和文件。
import logging
logger = logging.getLogger("example_logger")
logger.setLevel(logging.DEBUG)
# 創(chuàng)建兩個Handler,分別輸出到控制臺和文件
console_handler = logging.StreamHandler() # 輸出到控制臺
file_handler = logging.FileHandler("logfile.log", encoding="utf-8") # 輸出到文件
# 創(chuàng)建Formatter并設(shè)置格式
formatter = logging.Formatter(
'[%(name)s] [%(asctime)s] [%(levelname)s] %(message)s'
)
console_handler.setFormatter(formatter) # 控制臺Handler設(shè)置Formatter
file_handler.setFormatter(formatter) # 文件Handler設(shè)置Formatter
# 將Handler添加到Logger中
logger.addHandler(console_handler)
logger.addHandler(file_handler)
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")
logger.critical("This is a critical message")我們運行下這段代碼可以發(fā)現(xiàn)不僅終端有輸出,我們的日志文件里面也有記錄:


到此這篇關(guān)于Python日志模塊Logging使用指北的文章就介紹到這了,更多相關(guān)Python日志模塊Logging內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基于httpx模塊實現(xiàn)發(fā)送請求
這篇文章主要介紹了Python基于httpx模塊實現(xiàn)發(fā)送請求,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
Python數(shù)據(jù)庫封裝實現(xiàn)代碼示例解析
這篇文章主要介紹了Python數(shù)據(jù)庫封裝實現(xiàn)代碼示例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Python中識別圖片/滑塊驗證碼準確率極高的ddddocr庫詳解
驗證碼的種類有很多,它是常用的一種反爬手段,包括:圖片驗證碼,滑塊驗證碼,等一些常見的驗證碼場景。這里推薦一個簡單實用的識別驗證碼的庫?ddddocr?(帶帶弟弟ocr)庫,希望大家喜歡2023-02-02
python創(chuàng)建exe文件的實現(xiàn)步驟
本文主要介紹了python創(chuàng)建exe文件的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09

