1.logging提供了一組便利的函數,用來做簡單的日志。它們是 debug()、 info()、 warning()、 error() 和 critical()。
1.1logging以嚴重程度遞增排序:
DEBUG:詳細信息,一般只在調試問題時使用
INFO:證明事情按預期工作
WARNING:某些沒有預料到的時間提示,或者在將來可能會出現的問題提示。例如:磁盤空間不足,但是軟件還是會照常運作
ERROR:由於更嚴重的問題,軟件已不能執行一些功能了
CRITICAL:嚴重錯誤,表明軟件已不能繼續運行了
級別排序:CRITICAL>ERROR>WARNING>INFO>DEBUG
默認等級是WARNING
1.2打印到控制台
import logging logging.debug('debug 信息') logging.warning('只有這個會輸出。。。') logging.info('info 信息')
由於默認設置的等級是warning,所有只有warning的信息會輸出到控制台。
WARNING:root:只有這個會輸出。。。
利用logging.basicConfig()打印信息到控制台
import logging
logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] '
'- %(levelname)s: %(message)s',level=logging.INFO)
logging.debug('debug 信息')
logging.info('info 信息')
logging.warning('warning 信息')
logging.error('error 信息')
logging.critical('critial 信息')

所以如果設置level = logging.debug()的話,所有的信息都會會輸出到控制台。
所以如果設置level = logging.info()的話,debug 的信息則不會輸出到控制台。
1.3既往屏幕中寫入,也往文件寫入log
loggin庫采用了模塊化的設計,提供了許多組件:記錄器(logger),處理器(handler),過濾器(filter),格式化器(formatter)
Logger 暴露了應用程序代碼能直接使用的接口。
Handler將(記錄器產生的)日志記錄發送至合適的目的地。
Filter提供了更好的粒度控制,它可以決定輸出哪些日志記錄。
Formatter 指明了最終輸出中日志記錄的布局
loggers:要做三件事情。首先,它們向應用代碼暴露了許多方法,這樣應用可以在運行時記錄消息。其次,記錄器對象通過嚴重程度
(默認的過濾設施)或者過濾器對象來決定哪些日志消息需要記錄下來。第三,記錄器對象將相關的日志消息傳遞給所有感興趣的日志處理器。
Loggers的使用方法 :
Logger.setLevel()指定logger將會處理的最低的安全等級日志信息, debug是最低的內置安全等級,critical是最高的內建安全等級。
Logger.addHandler()和Logger.removeHandler()從記錄器對象中添加和刪除處理程序對象。處理器詳見Handlers。
Logger.addFilter()和Logger.removeFilter()從記錄器對象添加和刪除過濾器對象。
handlers:處理程序對象負責將適當的日志消息(基於日志消息的嚴重性)分派到處理程序的指定目標。Logger對象可以通過addHandler()方法
增加零個或多個handler對象。舉個例子,一個應用可以將所有的日志消息發送至日志文件,所有的錯誤級別(error)及以上的日志消息發送至
標准輸出,所有的嚴重級別(critical)日志消息發送至某個電子郵箱。在這個例子中需要三個獨立的處理器,每一個負責將特定級別的消息發
送至特定的位置。
handlers的使用方法:
logging.StreamHandler() -> 控制台輸出
logging.FileHandler(filename[,mode]) -> 文件輸出
logging.handlers.RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]]) -> 按照大小自動分割日志文件,一旦達到指定的大小重新生成文件
maxBytes用於指定日志文件的最大文件大小。如果maxBytes為0,意味着日志文件可以無限大,這時上面描述的重命名過程就不會發生。
backupCount用於指定保留的備份文件的個數。
logging.handlers.TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]]) -> 按照時間自動分割日志文件
配置方法:
setLevel()方法和日志對象的一樣,指明了將會分發日志的最低級別。為什么會有兩個setLevel()方法?記錄器的級別決定了消息是否要傳遞給處理器。每個處理器的級別決定了消息是否要分發。setFormatter()為該處理器選擇一個格式化器。addFilter()和removeFilter()分別配置和取消配置處理程序上的過濾器對象。
使用流程圖:
先獲取記錄器:
self.logger=logging.getLogger()
設置日志等級
self.logger.setLevel(level)
設置日志輸出格式
fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
format_str = logging.Formatter(fmt)
獲取處理器
sh=logging.StreamHandler()
設置處理器的日志輸出格式
sh.setFormatter(format_str)
添加到處理器中
self.logger.addHandler(sh)
