python進(jìn)階之logging日志模塊的使用
引言
在軟件開發(fā)中,日志(Logging)是不可或缺的工具。它幫助我們追蹤程序執(zhí)行流程、診斷錯(cuò)誤、監(jiān)控系統(tǒng)狀態(tài),是調(diào)試、運(yùn)維和分析用戶行為的關(guān)鍵。Python 內(nèi)置的 logging 模塊功能強(qiáng)大且靈活,遠(yuǎn)超簡(jiǎn)單的 print 語句。
一、logging對(duì)比print
你可能習(xí)慣用 print() 輸出信息,但 logging 模塊提供了 print 無法比擬的優(yōu)勢(shì):
- 日志級(jí)別(Levels):支持
DEBUG,INFO,WARNING,ERROR,CRITICAL等級(jí)別,可以方便地控制不同環(huán)境(開發(fā)、測(cè)試、生產(chǎn))輸出的信息量。 - 靈活的輸出目標(biāo)(Handlers):日志可以同時(shí)輸出到控制臺(tái)、文件、網(wǎng)絡(luò)、郵件、數(shù)據(jù)庫(kù)等,而
print只能輸出到標(biāo)準(zhǔn)輸出。 - 豐富的格式化(Formatters):可以自定義日志的輸出格式,包含時(shí)間、模塊名、行號(hào)、日志級(jí)別等信息。
- 性能:在生產(chǎn)環(huán)境中,可以將日志級(jí)別設(shè)為
WARNING,此時(shí)debug()調(diào)用幾乎不消耗性能(因?yàn)橄⒉粫?huì)被格式化),而print語句即使注釋掉也需要手動(dòng)操作。 - 結(jié)構(gòu)化與可維護(hù)性:
logging提供了清晰的架構(gòu),易于配置和管理,適合大型項(xiàng)目。
二、基本使用方法
2.1 導(dǎo)入 logging 模塊
import logging
2.2 日志級(jí)別介紹
日志級(jí)別用于控制日志的詳細(xì)程度。logging 模塊提供了以下幾種日志級(jí)別:
| 級(jí)別 | 數(shù)值 | 說明 |
|---|---|---|
| CRITICAL | 50 | 致命,嚴(yán)重錯(cuò)誤,程序可能無法繼續(xù)運(yùn)行 |
| ERROR | 40 | 錯(cuò)誤,但程序仍可運(yùn)行 |
| WARNING | 30 | 警告,表示潛在的問題,但程序仍能正常運(yùn)行。默認(rèn)級(jí)別) |
| INFO | 20 | 提示,程序正常運(yùn)行時(shí)的信息 |
| DEBUG | 10 | 調(diào)試,詳細(xì)的調(diào)試信息,通常用于開發(fā)階段 |
| NOTSET | 0 | 繼承,繼承父記錄器的級(jí)別 |
注意:默認(rèn)日志級(jí)別是 WARNING,即低于 WARNING 的日志不會(huì)被輸出。
需要設(shè)置日志顯示的最低顯示級(jí)別。如顯示所有日志,設(shè)置為最低級(jí)別DEBUG:
logging.basicConfig(level=logging.DEBUG)
2.3 簡(jiǎn)單使用示例
快速使用日志的完整功能示例:
import logging
logging.basicConfig(level=logging.INFO)
logging.debug("這是一條調(diào)試信息")
logging.info("這是一條普通信息")
logging.warning("這是一條警告信息")
logging.error("這是一條錯(cuò)誤信息")
logging.critical("這是一條嚴(yán)重錯(cuò)誤信息")運(yùn)行結(jié)果:

三、logging 模塊的核心組件
logging 模塊基于一個(gè)經(jīng)典的 生產(chǎn)者-過濾器-處理器 模型,主要由四個(gè)核心對(duì)象構(gòu)成:
| 類 | 說明 | 示例 |
|---|---|---|
| logging.Logger | 記錄器,用于發(fā)出日志消息 | logger = logging.getLogger("my_logger") |
| logging.Handler | 處理器,決定日志輸出位置(如文件、控制臺(tái)等) | handler = logging.FileHandler("app.log") |
| logging.Formatter | 格式化器,控制日志輸出的格式 | formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') |
| logging.Filter | 過濾器,用于更精細(xì)地控制日志記錄 | filter = logging.Filter("module.name") |
3.1 Logger (記錄器)
角色:應(yīng)用程序的接口。你通過 Logger 對(duì)象調(diào)用 debug(), info(), warning(), error(), critical() 方法來記錄日志。
關(guān)鍵屬性:
- 名稱(Name):通常使用 logging.getLogger(__name__) 創(chuàng)建,__name__ 是模塊的全名(如 myapp.module),這有助于組織日志層次結(jié)構(gòu)。
- 級(jí)別(Level):Logger 有一個(gè)日志級(jí)別。只有級(jí)別大于或等于此級(jí)別的日志記錄才會(huì)被處理。如果 Logger 本身沒有設(shè)置級(jí)別,它會(huì)向上傳遞到父 Logger(最終到根 Logger)。
層級(jí)結(jié)構(gòu):Logger 按名稱形成樹狀結(jié)構(gòu)。myapp 是 myapp.module 的父 Logger。日志消息會(huì)沿著這個(gè)層級(jí)向上傳播,除非設(shè)置了 propagate=False。
3.2 Handler (處理器)
角色:決定日志消息的最終去向。一個(gè) Logger 可以有多個(gè) Handler。
常見 Handler:
- StreamHandler:輸出到流(如 sys.stdout, sys.stderr)。
- FileHandler:輸出到文件。
- RotatingFileHandler:輸出到文件,并在文件達(dá)到一定大小時(shí)輪轉(zhuǎn)。
- TimedRotatingFileHandler:按時(shí)間(如每天)輪轉(zhuǎn)日志文件。
- SMTPHandler:通過郵件發(fā)送日志。
- SocketHandler / DatagramHandler:通過網(wǎng)絡(luò)發(fā)送日志。
| 處理器 | 說明 |
|---|---|
| StreamHandler | 輸出到控制臺(tái)(sys.stdout / sys.stderr) |
| FileHandler | 輸出到文件(文本) |
| RotatingFileHandler | 按大小輪轉(zhuǎn)日志文件 |
| TimedRotatingFileHandler | 按時(shí)間輪轉(zhuǎn)日志文件 |
| SMTPHandler | 通過郵件發(fā)送日志 |
| SocketHandler / DatagramHandler | 通過網(wǎng)絡(luò)發(fā)送日志 |
| NullHandler | 空處理器,用于避免無 handler 時(shí)的警告 |
關(guān)鍵屬性:
級(jí)別(Level):
Handler也有自己的級(jí)別。即使Logger接受了一條日志,Handler也會(huì)根據(jù)自己的級(jí)別再次過濾。例如,Logger級(jí)別是DEBUG,Handler級(jí)別是INFO,那么DEBUG級(jí)別的日志不會(huì)被這個(gè)Handler處理。Formatter:關(guān)聯(lián)一個(gè)
Formatter來格式化日志消息。
3.3 Formatter (格式化器)
角色:定義日志消息的最終輸出格式。
格式:使用類似
%(asctime)s - %(name)s - %(levelname)s - %(message)s的字符串。可以為不同的
Handler設(shè)置不同的Formatter。例如,文件日志包含詳細(xì)信息(時(shí)間、行號(hào)),而控制臺(tái)日志只顯示簡(jiǎn)潔信息。
Formatter 常用格式字段如下:
| 字段 | 說明 | 示例輸出 |
|---|---|---|
| %(asctime)s | 日志創(chuàng)建時(shí)間 | 2023-01-01 12:00:00,123 |
| %(levelname)s | 日志級(jí)別名稱 | INFO |
| %(message)s | 日志消息內(nèi)容 | 程序啟動(dòng)成功 |
| %(name)s | 記錄器名稱 | my_logger |
| %(filename)s | 生成日志的文件名 | app.py |
| %(lineno)d | 生成日志的行號(hào) | 42 |
| %(funcName)s | 生成日志的函數(shù)名 | main |
| %(pathname)s | 生成源文件的完整路徑 | |
| %(module)s | 生成模塊名(文件名去掉 .py) | |
| %(process)d | 生成進(jìn)程ID | |
| %(thread)d | 生成線程 ID |
3.4 Filter (過濾器)
- 角色:提供更精細(xì)的日志過濾機(jī)制,可以基于
Logger名稱、日志級(jí)別或其他屬性進(jìn)行過濾。 - 使用場(chǎng)景:相對(duì)較少直接使用,
Logger和Handler的級(jí)別通常足夠。但可以用于實(shí)現(xiàn)復(fù)雜邏輯,比如只記錄特定用戶的日志。
3.5 核心組件快速使用示例
import logging
# 1. 獲取一個(gè) Logger 實(shí)例(通常使用模塊名)
logger = logging.getLogger(__name__)
# 2. 設(shè)置 Logger 級(jí)別
logger.setLevel(logging.DEBUG)
# 3. 創(chuàng)建 Handler (例如,輸出到控制臺(tái))
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # Handler 級(jí)別
# 4. 創(chuàng)建 Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
# 5. 將 Handler 添加到 Logger
logger.addHandler(console_handler)
# 6. 記錄日志
logger.debug("調(diào)試信息")
logger.info("普通信息")
logger.warning("警告信息")
logger.error("錯(cuò)誤信息")
logger.critical("嚴(yán)重錯(cuò)誤")運(yùn)行結(jié)果:

四、高級(jí)用法與最佳實(shí)踐
1、配置分離:將日志配置獨(dú)立出來
將配置放在單獨(dú)的文件中,是大型項(xiàng)目的標(biāo)準(zhǔn)做法。推薦使用 dictConfig。
# logging_config.py
import logging
from logging.config import dictConfig
?
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": False, # 避免禁用第三方庫(kù)日志
"formatters": {
"detailed": {
"format": "%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s"
},
"simple": {
"format": "%(name)s - %(levelname)s - %(message)s"
}
},
"handlers": {
"file": {
"class": "logging.handlers.RotatingFileHandler", # 輪轉(zhuǎn)文件
"level": "DEBUG",
"formatter": "detailed",
"filename": "app.log",
"maxBytes": 10485760, # 10MB
"backupCount": 5, # 保留 5 個(gè)備份
"encoding": "utf-8"
},
"console": {
"class": "logging.StreamHandler",
"level": "INFO",
"formatter": "simple"
}
},
"loggers": {
"myapp": { # 為你的應(yīng)用定義 logger
"level": "DEBUG",
"handlers": ["file", "console"],
"propagate": False
}
}
}
?
dictConfig(LOGGING_CONFIG)
logger = logging.getLogger("myapp") # 創(chuàng)建全局 logger 實(shí)例在其他模塊中使用:
# main.py
from logging_config import logger
?
logger.info("應(yīng)用啟動(dòng)")2、RotatingFileHandler 分割日志文件
FileHandler 會(huì)無限增長(zhǎng)文件。使用 RotatingFileHandler 或 TimedRotatingFileHandler 可以自動(dòng)管理日志文件大小和數(shù)量。
3、捕獲異常信息
try:
result = 1 / 0
except Exception as e:
logger.error("發(fā)生異常", exc_info=True) # exc_info=True 會(huì)自動(dòng)記錄 traceback
# 或者使用
# logger.exception("發(fā)生異常") # 等價(jià)于 logger.error(..., exc_info=True)4、在多模塊項(xiàng)目中使用name
# myapp/utils.py
import logging
logger = logging.getLogger(__name__) # __name__ 是 'myapp.utils'
?
def some_function():
logger.info("在 utils 模塊中執(zhí)行")這樣日志會(huì)清晰地顯示來源 myapp.utils - INFO - 在 utils 模塊中執(zhí)行。
5、避免重復(fù)日志
問題:如果 Logger 的 propagate=True(默認(rèn))且父 Logger 也有 Handler,日志可能被多次輸出。
解決方案:在配置中為你的應(yīng)用 Logger 設(shè)置 "propagate": False。
處理中文 在 FileHandler 或 RotatingFileHandler 中指定 encoding="utf-8"。
總結(jié)
Python 的 logging 模塊是一個(gè)功能完備、設(shè)計(jì)精良的日志框架。掌握其核心組件(Logger, Handler, Formatter, Filter)的工作原理,是構(gòu)建可靠應(yīng)用的基礎(chǔ)。通過合理的配置(尤其是使用 dictConfig 分離配置),你可以輕松實(shí)現(xiàn):
- 多環(huán)境適配:開發(fā)時(shí)輸出
DEBUG信息,生產(chǎn)時(shí)只輸出WARNING及以上。 - 多目標(biāo)輸出:同時(shí)將詳細(xì)日志寫入文件,將關(guān)鍵信息輸出到控制臺(tái)。
- 結(jié)構(gòu)化日志:包含時(shí)間、位置、級(jí)別等上下文信息,便于排查問題。
- 可維護(hù)性:配置集中管理,易于調(diào)整。
告別 print,擁抱 logging,讓你的應(yīng)用擁有清晰、可追溯的“生命日志”!
到此這篇關(guān)于python進(jìn)階之logging日志模塊的使用的文章就介紹到這了,更多相關(guān)python logging日志 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)通過pil模塊對(duì)圖片格式進(jìn)行轉(zhuǎn)換的方法
這篇文章主要介紹了python實(shí)現(xiàn)通過pil模塊對(duì)圖片格式進(jìn)行轉(zhuǎn)換的方法,涉及Python中pil模塊的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
python字符串駐留機(jī)制的使用范圍知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python字符串駐留機(jī)制的使用范圍相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-09-09
Python+OpenCV實(shí)現(xiàn)單個(gè)圓形孔和針檢測(cè)
這篇文章主要為大家詳細(xì)介紹了如何通過Python+OpenCV實(shí)現(xiàn)單個(gè)圓形孔和針檢測(cè)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-10-10
分析Python字符串拼接+=和join()哪個(gè)速度更快
這篇文章主要分析了Python中字符串拼接+=和join()哪個(gè)速度更快,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
從基礎(chǔ)到高級(jí)詳解Python數(shù)值格式化輸出的完全指南
在數(shù)據(jù)分析、金融計(jì)算和科學(xué)報(bào)告領(lǐng)域,數(shù)值格式化是提升可讀性和專業(yè)性的關(guān)鍵技術(shù),本文將深入解析Python中數(shù)值格式化輸出的相關(guān)方法,感興趣的小伙伴可以了解下2025-08-08

