日志是一個系統的重要組成部分,用以記錄用戶操作、系統運行狀態和錯誤信息。日志記錄的好壞直接關系到系統出現問題時定位的速度。logging模塊Python2.3版本開始成為Python標準庫的一部分。
?
日志級別
在最簡單的使用中,我們直接導入logging模塊,然后調用它的debug、info、warn、error和critical等函數記錄日志。默認情況下,logging模塊將日志打印到屏幕終端,日志級別為WARNNING,也就是說日志級別大于等于WARNING的日志才會被顯示


#!/usr/bin/python3 import logginglogging.debug('debug message') logging.info('info message') logging.warn('warn message') logging.error('error.message') logging.critical('critical.message')
程序執行結果如下:
$ python3 default_logging.py
WARNING:root:warn message
ERROR:root:error.message
CRITICAL:root:critical.message
日志級別是一個邏輯上的概念,用來區分日志的重要程度。將日志分為不停級別的日志后,一方面可以在大多數時間只保存級別比較高的日志來提高性能;領一方面也便于日志的分析。例如,從一個超大的日志文件中,快速找出幾條錯誤信息。
在python的logging模塊中,日志分為5個級別:
日志級別 | 權重 | 含義 |
CAITICAL | 50 | 嚴重錯誤,表名軟件已不能繼續運行了 |
ERROR | 40 | 發生嚴重的錯誤,必須馬上處理 |
WARNING | 30 | 應用程序可以容忍這些信息,軟件還是在正常工作,不過它們應該被檢查及修復,否則將在不久的將來發生問題 |
INFO | 20 | 證明事情按預期工作,突出強調應用程序的運行過程 |
DEBUG | 10 | 詳細信息,只有開發人員調試程序時才需要關注的事情 |
配置日志格式
在使用logging記錄日志之前,我們可以進行一些簡單的配置,如下:
#!/usr/bin/python3 import logginglogging.basicConfig(filename='app.log', level=logging.INFO)logging.debug('debug message') logging.info('info message') logging.warn('warn message') logging.error('error.message') logging.critical('critical.message')
執行上面的程序,會在當前目錄下產生一個app.log文件。該文件中存在INFO及INFO以上級別的日志記錄。
上面我們通過basicConfig方法對日志進行了簡單的配置,我們也可以進行更加復雜的日志配置。在這之前先了解logging模塊中的幾個概念:
- Logger:日志記錄器,是應用程序中能直接使用的接口
- Handler: 日志處理器,用以表名將日志保存到什么地方以及保存多久
- Formatter: 格式化,用以配置日志的輸出格式
在典型的使用場景中,一個日志記錄器使用一個日志處理器,一個日志處理器使用一個日志格式化
python的logging模塊提供給你了多種方式來配置日志。對于比較簡單的腳本,可以直接使用basicConfig在代碼中配置日志。對于比較復雜的項目,可以將日志的配置保存在一個配置文件中,然后在代碼中使用fileConfig函數讀取配置文件。
?
源碼中配置日志示例
在這個例子中,日志文件會保存所有DEBUG級別及以上級別的日志。每一條日志包含了打印日志的時間,日志的級別和日志的內容
#!/usr/bin/python3 import logginglogging.basicConfig(filename='app.log',level=logging.DEBUG,format='%(asctime)s : %(levelname)s : %(message)s')logging.debug('debug message') logging.info('info message') logging.warn('warn message') logging.error('error.message') logging.critical('critical.message')
?
典型的日志配置文件示例
對于復雜的項目,一般將日志配置保存到配置文件中。如下:logging.cnf
#首先在[loggers]聲明一個名為root的logger [loggers] keys = root#在[handlers]中聲明一個名為logfile的handler [handlers] keys = logfile#在[formatters]中聲明一個名為generic的formatter [formatters] keys = generic#在[logger_root]中定義root這個logger所使用的handler [logger_root] handlers = logfile#在[handler_logfile]中定義handler輸出日志方式、日志文件的切換時間等 [handler_logfile] class = handlers.TimedRotatingFileHandler args = ('app.log',) level = DEBUG format = generic#[在formatter_generic]中定義了日志的格式,包括日志產生的時間、日志級別、產生日志的文件名和行號等信息 [formatter_generic] format = '%(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s'
python代碼中使用logging.config模塊的fileConfig函數加載日志配置
#!/usr/bin/python3 import logging import logging.configlogging.config.fileConfig('logging.cnf')logging.debug('debug message') logging.info('info message') logging.warn('warn message') logging.error('error.message') logging.critical('critical.message')