logging日誌模組
阿新 • • 發佈:2020-10-09
低到高分別為:
(1)DEBUG:輸出詳細的執行情況,主要用於除錯---》debug()
(2)INFO:確認一切按預期執行,一般用於輸出重要執行情況---》info()
(3)WARNING:一些意想不到的事情發生了(比如:警告),但是這個軟體還能按預期工作 ---》warning()
(4)ERROR:發生了錯誤,軟體沒能執行一些功能,還可以繼續執行 ---》error()
II.日誌原理
py檔案中記錄日誌 ---收集日誌---》日誌收集器---輸出日誌---》控制檯/檔案
III.寫日誌過程
(1)建立一個收集器,名稱自定義: logger = logging.getLogger('name')
(3)輸出到日誌
- 建立一個輸出渠道
- 輸出到日誌檔案
- 輸出到日誌檔案
fh = logging.FileHandler(LOG_PATH ,encoding='utf-8') # 輸出模式預設a(追加)
sh = logging.StreamHandler()
(4)設定輸出格式
formatter = logging.Formatter('%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s') # 時間-檔名-行號-日誌級別-輸出資訊
%(name)s | 收集器名稱 |
---|---|
%(levelno)s | 列印日誌級別的數值【數字形式】 |
%(levelname)s | 列印日誌級別名稱【文字形式】 |
%(pathname)s | 列印當前執行程式的路徑,其實就是sys.argv[0] |
%(filename)s | 列印當前執行程式名 |
%(module)s | 列印當前模組名 |
%(lineno)d | 列印日誌輸出函式的語句所在的程式碼行 |
%(funcName)s | 列印日誌當前函式名 |
%(thread)d | 列印執行緒ID |
%(threadName)s | 列印執行緒名稱 |
%(process)d | 列印程序ID |
%(message)s | 列印日誌資訊 |
%(name)s | Logger的名字 |
%(created)f | 當前時間,用unix標準表示時間的浮點數表示 |
%(relativeCreated)d | 輸出日誌資訊時,自Logger建立的毫秒數 |
%(asctime)s | 字串形式的當前時間,預設格式為"年-月-日 時:分:秒,毫秒" |
(5)收集器對接輸出渠道,並格式化
#輸出到日誌檔案 logger.addHandler(fh) fh.setFormatter(formatter) #輸出到控制檯 logger.addHandler(sh) sh.setFormatter(formatter)
(6)收集日誌
if level == 'DEBUG': logger.debug(msg) elif level == 'ERROR': logger.error(msg) elif level == 'INFO': logger.info(msg) elif level == 'WARNING': logger.warning(msg) elif level == 'CRITICAL': logger.critical(msg)
(7)關閉日誌渠道
logger.removeHandler(fh)
logger.removeHandler(sh)
日誌檔案完整程式碼
import os import time import logging from logging.handlers import TimedRotatingFileHandler,RotatingFileHandler # 日誌輪轉 from com.contants import LOG_DIR # 日誌檔案路徑 from com.myconf import conf # 配置檔案物件 log_path = os.path.join(LOG_DIR,'log' + time.strftime('%Y-%m-%d') +'.log') # 輸出日誌檔名稱 class MyLogger(object): @staticmethod def get_log(): # 1. 定義一個日誌收集器,預設名稱為root logger = logging.getLogger() # 2. 設定日誌收集器的等級 logger.setLevel(conf.get('logging', 'level')) # 3. 輸出到日誌 # (1) 建立一個輸出到日誌檔案的輸出渠道 fh = logging.FileHandler(log_path ,encoding='utf-8') """ # 按檔案大小進行輪轉,保留最新的日誌資訊 fh = RotatingFileHandler(filename= 'test.logs', maxBytes =1024*1024, # 設定檔案大小:位元組--1MB = 1024*1024byte backupCount= 3 ) # 輪轉的檔案數量 # 按時間進行輪轉 fh = TimedRotatingFileHandler(filename='test.logs', encoding='utf8', when='D', # D:表示天 interval = 1, # 時間間隔 backupCount=30) # 輪轉的檔案數量 """ # (2) 設定輸出級別 fh.setLevel(conf.get('logging', 'fhlevel')) # 4. 輸出到控制檯 # (1) 建立一個輸出到控制檯的輸出渠道 sh = logging.StreamHandler() # (2) 設定輸出級別 sh.setLevel(conf.get('logging', 'shlevel')) # 5. 設定輸出格式 formatter = logging.Formatter('%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s') # 6. 收集器對接輸出渠道,並格式化 logger.addHandler(fh) fh.setFormatter(formatter) logger.addHandler(sh) sh.setFormatter(formatter) return logger # 呼叫類的靜態方法,建立一個日誌收集器 my_log = MyLogger.get_log()