python中l(wèi)ogger包的詳細使用教程(附實例代碼)
前言
Python 的 logging
模塊是標準庫中用于記錄日志的核心工具,通過靈活配置可實現(xiàn)多級別、多目標、多格式的日志管理。以下是其核心用法及詳細說明:
功能說明
一、Logger 的創(chuàng)建與基礎配置
創(chuàng)建 Logger 實例使用
logging.getLogger(name)
創(chuàng)建或獲取一個 Logger 對象。若未指定名稱,默認返回根 Logger(root
)。import logging logger = logging.getLogger('my_app') # 創(chuàng)建名為 'my_app' 的 Logger
設置日志級別Logger 的級別決定其處理的最低日志等級,可選級別從低到高為:
DEBUG
、INFO
、WARNING
、ERROR
、CRITICAL
。logger.setLevel(logging.DEBUG) # 記錄 DEBUG 及以上級別的日志
默認級別與繼承關系
- 若未顯式設置級別,Logger 會繼承父級(如
root
)的級別,默認WARNING
。 - Logger 名稱支持層級結構(如
a.b
繼承a
的配置),便于模塊化日志管理。
- 若未顯式設置級別,Logger 會繼承父級(如
二、Handler 的配置與使用
Handler 負責將日志發(fā)送到不同目標(如文件、控制臺),可同時添加多個 Handler 實現(xiàn)多路輸出。
常用 Handler 類型
Handler | 功能 | 示例 |
---|---|---|
StreamHandler | 輸出到控制臺(默認 sys.stderr ) | logging.StreamHandler() |
FileHandler | 輸出到文件 | logging.FileHandler('app.log', mode='a') |
RotatingFileHandler | 日志文件按大小回滾(避免文件過大) | from logging.handlers import RotatingFileHandler |
TimedRotatingFileHandler | 按時間回滾日志文件(如每天生成新文件) | from logging.handlers import TimedRotatingFileHandler |
示例:同時輸出到文件和控制臺
# 文件 Handler(按大小回滾) from logging.handlers import RotatingFileHandler file_handler = RotatingFileHandler( 'app.log', maxBytes=1024*1024, backupCount=5 # 單個文件最大1MB,保留5個備份 ) file_handler.setLevel(logging.INFO) # 控制臺 Handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) # 添加 Handler 到 Logger logger.addHandler(file_handler) logger.addHandler(console_handler)
三、Formatter 自定義日志格式
通過 Formatter
可定義日志輸出的格式,支持占位符如 %(asctime)s
(時間)、%(levelname)s
(級別)、%(message)s
(消息)等。
formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' # 自定義時間格式 ) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter)
四、記錄不同級別的日志
通過 Logger 對象調用對應級別的方法記錄日志:
logger.debug('調試信息,用于開發(fā)階段追蹤細節(jié)') # 僅當 Logger 級別 ≤ DEBUG 時輸出 logger.info('常規(guī)信息,如服務啟動') logger.warning('潛在問題警告,如參數(shù)缺失') logger.error('程序錯誤,但應用仍可運行') logger.critical('嚴重錯誤,可能導致程序崩潰')
五、高級配置與最佳實踐
全局配置快速啟動使用
logging.basicConfig()
快速配置根 Logger,適合簡單場景:logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(message)s', handlers=[logging.FileHandler('app.log'), logging.StreamHandler()] )
過濾器(Filter)通過
Filter
實現(xiàn)更精細的日志篩選,例如僅記錄特定模塊或包含關鍵字的日志:class CustomFilter(logging.Filter): def filter(self, record): return 'important' in record.getMessage() # 僅記錄含 'important' 的日志 logger.addFilter(CustomFilter())
避免重復日志若 Logger 層級配置不當,可能導致日志重復輸出。建議在子 Logger 中禁用傳播到父級:
child_logger = logging.getLogger('my_app.sub_module') child_logger.propagate = False # 阻止日志傳遞給父 Logger
六、常見問題與調試
- 日志不顯示:檢查 Logger 和 Handler 的級別是否高于日志調用級別。
- 多 Handler 沖突:確保每個 Handler 的級別和 Formatter 獨立配置。
- 性能優(yōu)化:高頻日志場景可使用
RotatingFileHandler
避免文件過大,或異步日志庫(如concurrent-log-handler
)。
以下是 Python 中 logging
模塊的詳細使用教程,涵蓋基礎配置、高級用法及最佳實踐,結合多篇權威資料整理而成:
使用方法
一、基礎配置與快速使用
引入模塊與基礎配置通過
basicConfig()
函數(shù)快速配置全局日志參數(shù):import logging logging.basicConfig( level=logging.DEBUG, # 設置最低日志級別為 DEBUG format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S', # 時間格式 filename='app.log', # 輸出到文件(默認追加模式) filemode='w' # 覆蓋模式寫入文件(可選) )
記錄不同級別的日志使用預定義的日志級別方法輸出信息:
logging.debug('調試信息') # 開發(fā)階段追蹤細節(jié) logging.info('常規(guī)狀態(tài)') # 程序正常運行信息 logging.warning('潛在問題') # 如參數(shù)缺失或兼容性問題 logging.error('錯誤事件') # 功能異常但程序仍運行 logging.critical('嚴重故障') # 系統(tǒng)可能崩潰的致命錯誤
注意:只有不低于
level
參數(shù)設置的級別才會被記錄。
二、自定義 Logger 對象
創(chuàng)建獨立 Logger推薦為不同模塊創(chuàng)建獨立 Logger 以分類管理日志:
logger = logging.getLogger('my_module') # 名稱建議使用模塊名 logger.setLevel(logging.INFO) # 覆蓋全局級別
添加處理器(Handler)支持同時輸出到控制臺、文件、網絡等多種目標:
# 控制臺處理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) # 文件處理器(按大小輪轉) from logging.handlers import RotatingFileHandler file_handler = RotatingFileHandler( 'app.log', maxBytes=10*1024*1024, backupCount=5 # 10MB/文件,保留5個備份 ) file_handler.setLevel(logging.ERROR) # 將處理器附加到 Logger logger.addHandler(console_handler) logger.addHandler(file_handler)
自定義日志格式通過
Formatter
定義日志輸出樣式:formatter = logging.Formatter( '%(asctime)s [%(levelname)s] %(module)s:%(lineno)d - %(message)s', datefmt='%H:%M:%S' ) console_handler.setFormatter(formatter) file_handler.setFormatter(formatter)
三、高級用法
配置文件管理使用
.conf
或.ini
文件分離配置(推薦大型項目):import logging.config logging.config.fileConfig('logging.conf')
示例 logging.conf 內容:
[loggers] keys=root,my_app [handlers] keys=consoleHandler,fileHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_my_app] level=INFO handlers=fileHandler qualname=my_app propagate=0 # 禁止傳播到父級 Logger
日志傳播控制通過
propagate
屬性控制是否向父級 Logger 傳遞日志:child_logger = logging.getLogger('parent.child') child_logger.propagate = False # 僅當前 Logger 處理日志
過濾器(Filter)實現(xiàn)精細化日志篩選:
class KeywordFilter(logging.Filter): def __init__(self, keyword): super().__init__() self.keyword = keyword def filter(self, record): return self.keyword in record.getMessage() logger.addFilter(KeywordFilter('重要'))
四、最佳實踐與注意事項
性能優(yōu)化
- 避免高頻日志調用:使用
isEnabledFor()
檢查級別后再記錄:if logger.isEnabledFor(logging.DEBUG): logger.debug(f'耗時計算: {expensive_function()}')
- 使用異步日志庫(如
concurrent-log-handler
)處理高并發(fā)場景。
- 避免高頻日志調用:使用
多環(huán)境配置根據運行環(huán)境動態(tài)調整配置:
if os.getenv('ENV') == 'production': logger.setLevel(logging.WARNING) else: logger.setLevel(logging.DEBUG)
錯誤處理為關鍵操作添加異常捕獲并記錄堆棧:
try: risky_operation() except Exception as e: logger.exception('操作失敗: %s', e) # 自動記錄堆棧跟蹤
五、實際應用場景示例
網絡請求監(jiān)控:
import requests def fetch_data(url): try: response = requests.get(url, timeout=5) response.raise_for_status() logger.info(f'成功獲取 {url} 數(shù)據') return response.json() except requests.RequestException as e: logger.error(f'請求失敗: {url} - {str(e)}') return None
通過合理配置 Logger、Handler 和 Formatter,可以構建靈活高效的日志系統(tǒng)。更多高級功能(如遠程日志、郵件通知)可參考 Python 官方文檔。
總結
到此這篇關于python中l(wèi)ogger包詳細使用的文章就介紹到這了,更多相關python logger包使用教程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python 爬蟲之selenium可視化爬蟲的實現(xiàn)
這篇文章主要介紹了python 爬蟲之selenium可視化爬蟲的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12matplotlib交互式數(shù)據光標mpldatacursor的實現(xiàn)
這篇文章主要介紹了matplotlib交互式數(shù)據光標mpldatacursor的實現(xiàn) ,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02Python調用系統(tǒng)底層API播放wav文件的方法
這篇文章主要介紹了Python調用系統(tǒng)底層API播放wav文件的方法,涉及Python使用pywin32調用系統(tǒng)底層API讀取與播放wav文件的相關操作技巧,需要的朋友可以參考下2017-08-08python聚類算法解決方案(rest接口/mpp數(shù)據庫/json數(shù)據/下載圖片及數(shù)據)
這篇文章主要介紹了python聚類算法解決方案(rest接口/mpp數(shù)據庫/json數(shù)據/下載圖片及數(shù)據),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08