python中Logging模塊的正確使用方法包括:1.基礎配置,設置日志級別和格式;2.使用logger對象區分模塊來源并單獨控制日志級別;3.添加filehandler將日志寫入文件并保留控制臺輸出;4.上線前關閉debug日志、用模塊名命名logger、避免在庫代碼中配置logging、使用dictconfig做復雜配置。logging.basicconfig設置級別和格式,logger = logging.getlogger(__name__)創建模塊logger,同時添加streamhandler和filehandler實現多輸出,并通過setlevel控制不同模塊或全局的日志級別,確保日志結構清晰且便于維護。
在python項目中,logging模塊是記錄日志的首選工具。它靈活、功能強大,但很多人用不好,導致日志信息混亂、缺失或難以維護。配置好logging,不僅能幫助排查問題,還能提升系統的可觀測性。
基本配置:別再用print了
剛開始用logging時,很多人直接logging.info(“something”),這樣雖然比print強點,但遠遠不夠。建議一開始就做基礎配置:
import logging logging.basicConfig(level=logging.INFO)
這一步設定了最低日志級別為INFO,意味著DEBUG級別的日志不會顯示。如果你希望看到更詳細的日志,可以改成DEBUG;如果只關心錯誤,可以設成WARNING。
另外,建議設置格式和時間戳,比如:
立即學習“Python免費學習筆記(深入)”;
logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' )
這樣每條日志都有時間、級別和內容,看起來清晰多了。
使用logger而不是直接調用logging
很多人習慣直接使用logging.info()這樣的寫法,但在實際項目中,尤其是多個模塊協同工作時,應該使用logger對象。例如:
logger = logging.getLogger(__name__) logger.info("This is an info log")
好處有幾個:
- 每個模塊有自己的logger,便于區分來源
- 可以單獨控制不同模塊的日志級別
- 更容易添加handler、formatter等高級配置
舉個例子,你有兩個模塊main.py和utils.py,分別獲取各自的logger:
# main.py logger = logging.getLogger(__name__) # __name__ 是 'main' # utils.py logger = logging.getLogger(__name__) # __name__ 是 'utils'
之后你可以單獨設置某個模塊的日志級別,比如讓utils輸出DEBUG級別的日志,而main只輸出INFO以上:
logging.getLogger('utils').setLevel(logging.DEBUG)
把日志寫入文件,同時保留控制臺輸出
開發時看控制臺沒問題,但上線后通常需要把日志保存下來。這時候就需要添加FileHandler。
一個典型的配置方式如下:
import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 控制臺輸出 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 文件輸出 file_handler = logging.FileHandler('app.log') file_handler.setLevel(logging.INFO) # 設置格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # 添加到logger logger.addHandler(console_handler) logger.addHandler(file_handler)
這樣你的日志就會同時出現在終端和文件里,結構清晰、方便查看。
注意:如果你用了多個handler,記得不要重復添加,否則可能出現日志重復打印的問題??梢酝ㄟ^logger.handlers檢查當前綁定的handler。
此外,還可以考慮使用RotatingFileHandler或TimedRotatingFileHandler來實現日志滾動,避免單個日志文件過大或過久。
最后幾點小建議
- 別忘了關閉DEBUG日志:上線前確保日志級別不是DEBUG,避免產生大量無用信息。
- 命名logger時盡量用模塊名:像logging.getLogger(__name__)這種做法能保證層級清晰。
- 避免在庫代碼中配置logging:作為第三方庫開發者,不應該主動配置root logger,而是讓使用者去統一管理。
- 可以用dictConfig做更復雜的配置:對于大型項目,用字典形式配置logging會更清晰、易維護。
基本上就這些。logging不算難,但細節不少,稍不注意就踩坑。掌握這幾個關鍵點,基本就能應付大多數場景了。