Python里logging模塊配置 Python標準日志模塊logging最佳實踐

pythonLogging模塊的正確使用方法包括: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不算難,但細節不少,稍不注意就踩坑。掌握這幾個關鍵點,基本就能應付大多數場景了。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享