1. 程式人生 > 實用技巧 >logging日誌模組

logging日誌模組

I.日誌級別

低到高分別為:

(1)DEBUG:輸出詳細的執行情況,主要用於除錯---》debug()

(2)INFO:確認一切按預期執行,一般用於輸出重要執行情況---》info()

(3)WARNING:一些意想不到的事情發生了(比如:警告),但是這個軟體還能按預期工作 ---》warning()

(4)ERROR:發生了錯誤,軟體沒能執行一些功能,還可以繼續執行 ---》error()

(5)CRITICAL:一個嚴重的錯誤,表名程式本身可能無法繼續執行 ---》ctritical()

注意:logging模組預設收集的日誌:warning以上等級

II.日誌原理

py檔案中記錄日誌 ---收集日誌---》日誌收集器---輸出日誌---》控制檯/檔案

III.寫日誌過程

(1)建立一個收集器,名稱自定義: logger = logging.getLogger('name')

(2)設定日誌收集器的等級: logger.setLevel(LEVEL)

(3)輸出到日誌

  • 建立一個輸出渠道
    • 輸出到日誌檔案
fh = logging.FileHandler(LOG_PATH ,encoding='utf-8')  # 輸出模式預設a(追加)
    • 輸出到控制檯
sh = logging.StreamHandler()
  • 設定輸出級別:fh.setLevel(FHLEVEL) 或 sh.setLevel(SHLEVEL)

(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()