一、簡介
1、概要:logging 是python 用於記錄日志的標准模塊
2、logging 日志庫定義的日志級別:
級別 | 級別數值(int) | 使用時機 |
DEBUG | 10 | 詳細信息 |
INFO | 20 | 正常運行過程中產生的一些信息 |
WARNING | 30 | 警告信息,雖然程序正常運行,但有可能發生錯誤 |
ERROR | 40 | 運行出錯,程序已經不能執行一些功能了 |
CRITICAL | 50 | 嚴重錯誤,程序已經不能正常運行 |
3、logging 日志庫的四類組件(四個類)
Logger :記錄器 提供了應用程序代碼直接使用的接口 (是用記錄器去記錄日志,簡單理解就是 記錄日志的工具,類似 筆)(備注:一個記錄器可以對接多個處理器)
Handlers : 處理器 將記錄器產生的日志發送至指定的目的地 (就是日志輸出的位置,比如輸出到本地文件,控制台,或者發送至Email 等網絡上的任意位置,)
Filters: 過濾器 提供了更細粒度的功能,用於確定要輸出的日志記錄 (過濾日志用的)
Fomatters: 格式器:指定最終輸出中日志記錄的樣式。 (日志信息格式化用的)
二、logging 模塊的工作流程
Logger 記錄器:
1、創建記錄器對象:
logger=logging.getLogger(name=None) name 如果不傳 則返回 一個 root logger,
2、設置日志記錄器的級別
loger.setLevel()
3、講日志內容傳遞到關聯的handler
loger.addHandler() 關聯一個處理器
loger.removeHandler() 取消關聯
Handler 處理器
StreamHandler類型 :標准的輸出stdout (比如顯示器輸出,控制台輸出) 分發器
創建方法:logging.StreamHandler(stream=None)
FileHandler類型:將日志保存到磁盤文件的處理器
創建方法:file_handler = logging.FileHandler(filename='xx.log',mode='a',encoding='utf-8')
設置當前處理器對象使用的日志格式:
file_handler.setFormatter(ojb) #ojb 為 一個格式器對象
其他常用的 處理器類型:
BaseRotatingHandler
Rotating Filehandler 滾動的多日志輸出,按照時間or其他方式去生成多個日志
TimedRotatingfilehandler
Formatter 格式器
Formatter 格式器用來最終設置日志信息的順序,結構和內容
創建方法
formatter = logging.Formatter("%(asctime)s|%(levelname)8s|%(filename)10s%lineno)s|%(message)s")
Formatter對象的格式:
屬性 | 格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志產生的時間,默認格式為msecs2003-07-0816:49:45,896 |
msecs | %(msecs)d | 日志生成時間的亳秒部分 |
created | %(created)f | time.tme)生成的日志創建時間戳 |
message | %(message)s | 具體的日志信息 |
filename | %(filename)s | 生成日志的程序名 |
name | %(name)s | 日志調用者 (日志記錄器的名稱) |
funcname | %(funcName)s | 調用日志的函數名 |
levelname | %(levelname)s | 日志級別( DEBUG,INFO, WARNING, 'ERRORCRITICAL) |
levene | %( leveling)s | 日志級別對應的數值 |
lineno | %(lineno)d | 日志所針對的代碼行號(如果可用的話) |
module | %( module)s | 生成日志的模塊名 |
pathname | %( pathname)s | 生成日志的文件的完整路徑 |
process | %( (process)d | 生成日志的進程D(如果可用) |
processname | (processname)s | 進程名(如果可用) |
thread | %(thread)d | 生成日志的線程D(如果可用) |
threadname | %( threadname)s | 線程名(如果可用) |
Filter 過濾器
可以被 Handler 和 Logger 調用 用來實現比按層級提供更復雜的過濾操作。
創建過濾器:
flt = logging.Filter("cn.cccb")
在處理器和記錄器中進行過濾
logger.addFilter(flt)
file_handler.addFilter(flt)
三、一個簡單的例子
以下例子實現了一個日志記錄器同時往控制台和本地文件輸入不同級別的日志
import logging # 創建一個日志記錄器 loger = logging.getLogger('applog') # 設置日志記錄器的等級 INFO loger.setLevel(logging.INFO) # 創建一個將流式的日志處理器 steram_handler = logging.StreamHandler() # loger.removeHandler() #接觸綁定 #創建一個 輸出到磁盤文件的日志處理器 file_handler=logging.FileHandler(filename='file.log',mode='w',encoding='utf-8') # file_handler 設置日志等級為 ERROR ,沒有給handler 設置日志級別,該handler 將使用logger設置或者默認的級別 file_handler.setLevel(logging.ERROR) # 創建一個日志格式器 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") # 設置處理器輸出的日志格式 file_handler.setFormatter(formatter) steram_handler.setFormatter(formatter) # 設置一個過濾器 fl1 = logging.Filter('app2log') # 給日志記錄器設置一個過濾器 ,(從根部開始過濾) # loger.addFilter(fl1) #還可以給 handler 設置過濾器 (在輸出的時候過濾) steram_handler.addFilter(fl1) # 記錄器設置一個處理器 loger.addHandler(steram_handler) loger.addHandler(file_handler) # 寫入日志 loger.debug('debug log') loger.info('info log') loger.warning('warning log') loger.error('error log') loger.critical('critical log')
注意:Handler 可設置的日志級別是Logger 的設置的日志級別的子集(如果Logger沒設置,默認是WARNING)
假設Logger 設置INFO 級別的日志,Handler 設置的DEBUG級別的日志,那Handler 還是只能輸出INFO 及以上級別的日志
四、寫在最后:
logging本質是實現了一個日志記錄器按指定的等級獲取日志,在處理器上設置日志格式以及等級后,通過處理器輸出日志到指定位置
同時還可以通過filter 過濾器從logger 或者handler 處過濾不同記錄器產生的日志