Python 的 logging
模塊是一個靈活且強大的日志記錄工具,廣泛應用于應用程序的調試、運行監控和問題排查。它提供了豐富的功能,包括多級日志記錄、多種輸出方式、靈活的格式配置等。以下是詳細介紹:
一、為什么使用 logging
模塊?
- 替代
print
:print
語句僅適合簡單調試,而logging
支持持久化、級別控制、異步寫入等。 - 分級日志:根據重要性區分日志(如 DEBUG、INFO、ERROR),便于過濾信息。
- 靈活輸出:可同時輸出到控制臺、文件、網絡等。
- 線程安全:適用于多線程/多進程環境。
二、核心組件
-
Logger(記錄器)
應用程序直接調用的接口,負責產生日志。- 通過
logging.getLogger(name)
獲取或創建 Logger 實例。 - 支持層級結構(如
'parent.child'
繼承父級配置)。
- 通過
-
Handler(處理器)
決定日志的輸出位置(如控制臺、文件、郵件等)。- 常用 Handler:
StreamHandler
:輸出到流(如控制臺)。FileHandler
:輸出到文件。RotatingFileHandler
:按大小滾動日志文件。TimedRotatingFileHandler
:按時間滾動日志文件。SMTPHandler
:發送郵件。
- 常用 Handler:
-
Filter(過濾器)
提供更細粒度的日志過濾(如僅記錄特定關鍵詞的日志)。 -
Formatter(格式器)
定義日志的輸出格式(時間、級別、消息等)。- 常用格式字段:
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
- 常用格式字段:
三、日志級別
從低到高共 6 個級別(低于設定級別的日志將被忽略):
級別 | 數值 | 說明 |
---|---|---|
DEBUG | 10 | 詳細調試信息 |
INFO | 20 | 程序正常運行信息 |
WARNING | 30 | 潛在問題,但程序仍運行 |
ERROR | 40 | 嚴重錯誤,影響部分功能 |
CRITICAL | 50 | 致命錯誤,可能導致程序終止 |
四、基本使用步驟
-
創建 Logger
import logginglogger = logging.getLogger(__name__) # 推薦使用模塊名作為Logger名稱 logger.setLevel(logging.DEBUG) # 設置記錄的最低級別
-
配置 Handler 和 Formatter
# 創建控制臺 Handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.WARNING) # 控制臺只輸出 WARNING 及以上級別# 創建文件 Handler file_handler = logging.FileHandler('app.log') file_handler.setLevel(logging.DEBUG) # 文件記錄所有 DEBUG 及以上級別# 定義 Formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) file_handler.setFormatter(formatter)# 將 Handler 添加到 Logger logger.addHandler(console_handler) logger.addHandler(file_handler)
-
記錄日志
logger.debug('Debug 信息') logger.info('程序啟動') logger.warning('磁盤空間不足') logger.error('請求超時')
五、快速配置(basicConfig
)
適用于簡單場景的快速配置:
import logginglogging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',handlers=[logging.FileHandler('app.log'),logging.StreamHandler()]
)logging.warning('警告信息')
六、高級用法
-
配置文件或字典
使用logging.config
模塊通過文件或字典配置:import logging.configconfig = {'version': 1,'formatters': {'default': {'format': '%(asctime)s - %(levelname)s - %(message)s'}},'handlers': {'console': {'class': 'logging.StreamHandler','formatter': 'default','level': 'DEBUG'}},'root': {'handlers': ['console'],'level': 'INFO'} }logging.config.dictConfig(config)
-
捕獲異常信息
使用logger.exception
記錄異常堆棧:try:1 / 0 except Exception:logger.exception('發生異常:')
-
日志傳播
子 Logger 默認將日志傳遞給父 Logger。可通過logger.propagate = False
關閉。
七、常見問題
-
重復日志
原因:多次添加 Handler 或basicConfig
被多次調用。
解決:確保 Handler 只添加一次,或在basicConfig
中設置force=True
。 -
性能優化
避免在高頻代碼中記錄低級別日志(如 DEBUG),可預先檢查級別:if logger.isEnabledFor(logging.DEBUG):logger.debug(f'耗時操作: {time_consuming()}')
八、總結
logging
模塊通過靈活的配置和分級機制,滿足了從簡單到復雜的日志需求。掌握其核心組件(Logger、Handler、Formatter)和級別控制,能顯著提升程序的可維護性。建議在項目中替代 print
,合理利用日志進行調試和監控。