Python logging模組的使用

夾著巧克力吃發表於2020-12-06

logging是Python的標準庫,不需要我們安裝

import logging

logging.info("這是一個普通的資訊")
logging.debug("這是一個debug資訊")
logging.warning("這是警告資訊")
logging.error("出錯了,兄弟")
logging.critical("崩潰了")

結果如下:
在這裡插入圖片描述
可以看到,只有waring以上的等級列印了出來,因為每個日誌的等級是不一樣的
在這裡插入圖片描述

如何記錄錯誤

  • 我們一般使用tyr except時錯誤的日誌顯示出來
  • 示例如下:
def old_function():
    try:
        1/0
        logging.info("這個沒有問題")
    except Exception as e:
        logging.error(e)
    logging.warning("這個方法在下個版本中會被拋棄")
    return "hello"


# 我們一般使用tyr except時錯誤的日誌顯示出來

if __name__ == '__main__':
    old_function()

結果如下:
在這裡插入圖片描述
如果我們在裡面新增raise e 的話,程式會在raise的部分停止下來

def old_function():
    try:
        1/0
        logging.info("這個沒有問題")
    except Exception as e:
        logging.error(e)
        raise  e  #程式會在raise的部分停下來
    logging.warning("這個方法在下個版本中會被拋棄")
    return "hello"


# 我們一般使用tyr except時錯誤的日誌顯示出來

if __name__ == '__main__':
    old_function()

結果如下:
在這裡插入圖片描述

###日誌的組成部分
在這裡插入圖片描述
在這裡插入圖片描述

接下來,我們學習日誌的各個部分

例子如下:

import logging

# 初始化logger收集器,先寫日記本的名字
logger = logging.getLogger("日記本的名字:我的名字")  #其實這部分內容,就是上一部分列印出來的root

# 設定收集器的級別
logger.setLevel('DEBUG')

# 筆的預設級別是warning,預設是使用控制檯輸出
# console_output = logging.StreamHandler()
# 我們也可以放到file裡面

file_output = logging.FileHandler('log.txt')

# 新增handle
logger.addHandler(file_output)

logger.error("出錯了,兄弟")
logger.critical("崩潰了")

結果:
在這裡插入圖片描述
在這裡插入圖片描述
這裡面注意一下級別的問題。
如下程式碼,收集器的級別是debug,但是筆的級別是warnin,我們看一下結果。

import logging

# 初始化logger收集器,先寫日記本的名字
logger = logging.getLogger("日記本的名字:我的名字")  #其實這部分內容,就是上一部分列印出來的root

# 設定收集器的級別
logger.setLevel('DEBUG')  #低於debug型別的收集器是輸出不出來的。

# 筆的預設級別是warning,預設是使用控制檯輸出
# console_output = logging.StreamHandler()
# 我們也可以放到file裡面

handle = logging.FileHandler('log.txt')
handle.setLevel("WARNING")

# 新增handle
logger.addHandler(handle)

logger.info("出錯了,兄弟")
logger.critical("崩潰了")

結果:
在這裡插入圖片描述
結果中,就顯示了warning以上的等級。
我們就這樣記憶,筆記本有一個許可權
然後筆輸出還是會有一個許可權,這個就相當於一個漏斗一樣。
但是一般情況下,我們設定成一個級別就可以了

在這裡插入圖片描述

  • 當然,日誌模組你可以自定義多個收集器,但是一般沒有必要,你只需要定義一個模組就可以了

最後一部分是函式的封裝

  • 這裡就直接給封裝好的函式了,可以自行研究,其實,直接寫成def的函式形式也是可以的
import logging

class LoggerHandler():

    def __init__(self,
                 name = "root",
                 level = 'DEBUG',
                 file = None,
                 format = '%(asctime)s-%(name)s-%(levelname)s-%(message)s-%(lineno)s'
    ):
        logger = logging.getLogger(name)
        #設定級別
        logger.setLevel(level)

        fmt = logging.Formatter(format)
        # 初始化處理器
        if file:
            file_handle = logging.FileHandler(file)
            file_handle.setLevel(level)

            logger.addHandler(file_handle)
            file_handle.setFormatter(fmt)
        stream_handler = logging.StreamHandler()


        # 設定handle 的級別
        stream_handler.setLevel(level)

        logger.addHandler(stream_handler)
        stream_handler.setFormatter(fmt)

        self.logger = logger


    def debug(self,msg):
        return self.logger.debug(msg)

    def error(self,msg):
        return self.logger.error(msg)
    def critical(self,msg):
        return self.logger.critical(msg)
    def info(self,msg):
        return self.logger.info(msg)



if __name__ == '__main__':
    logger = LoggerHandler(file="log1.txt")
    logger.debug("hello world")


  • 第二種封裝方法(更推薦)
'''
繼承的辦法
因為,從封裝1的那個py檔案中可以看到,下面呼叫的函式都是繼承的別的類,那麼我們直接把那個類拿過來使用就可以了

'''

import logging

class LoggerHandler(logging.Logger):

    def __init__(self,
                 name = "root",
                 level = 'DEBUG',
                 file = None,
                 format = '%(asctime)s-%(name)s-%(levelname)s-%(message)s-%(lineno)s'
    ):

        # logger = logging.gerLogger(name)
        super().__init__(name)

        #logger = logging.getLogger(name)
        #設定級別
        self.setLevel(level)

        fmt = logging.Formatter(format)
        # 初始化處理器
        if file:
            file_handle = logging.FileHandler(file)
            file_handle.setLevel(level)

            self.addHandler(file_handle)
            file_handle.setFormatter(fmt)
        stream_handler = logging.StreamHandler()


        # 設定handle 的級別
        stream_handler.setLevel(level)

        self.addHandler(stream_handler)
        stream_handler.setFormatter(fmt)








if __name__ == '__main__':
    logger = LoggerHandler()
    logger.debug("hello world")

相關文章