日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 Python教程 正文

基于Python編寫簡單實用的日志裝飾器_python

作者:Ckend ? 更新時間: 2022-07-15 Python教程

在寫代碼的時候,往往會漏掉日志這個關鍵因素,導致功能在使用的時候出錯卻無法溯源。

其實,只需要寫一個非常簡單的日志裝飾器,我們就能大大提升排查問題的效率。

1.簡陋版裝飾器

寫一個裝飾器非常簡單,因為本質上裝飾器就是一個返回函數的“高階”函數而已:

1) 函數作為參數傳遞進裝飾器。

2) 裝飾器內定義一個函數,處理作為參數傳遞進來的函數。

3) 返回這個裝飾器內定義的函數

import datetime

def log(func):
    """
    日志裝飾器,簡單記錄函數的日志

    Args:
        func (function): 函數
    """
    def inner(*args):
        timestamp = str(datetime.datetime.now()).split(".")[0]
        res = func(*args)
        print(f"[{timestamp}] ({func.__name__}) {args} -> {res}")
        return res
    return inner

用一下試試看:

@log
def pluser(a, b):
    return a + b

pluser(1, 2)

效果如下:

雖然這樣可以實現我們所需要的功能,但其實有很大的優化空間。

2.普通版裝飾器

第一版代碼中有一個顯而易見的問題,裝飾器內定義的處理函數不支持kwargs,而在裝飾器中支持kwargs僅僅是舉手之勞而已。

第二個問題是,生成時間戳的時候采用字符串截取的形式,這種形式過于粗暴。其實可以使用strftime做字符串轉換。

修改如下:

import datetime

def log(func):
    """
    日志裝飾器,簡單記錄函數的日志

    Args:
        func (function): 函數
    """
    def inner(*args, **kwargs):
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        res = func(*args, **kwargs)
        print(f"[{timestamp}] ({func.__name__}) {args} -> {res}")
        return res
    return inner

似乎優化得差不多了,不過依然存在改進空間。

3.優化版裝飾器

在前兩版代碼中,我們使用print進行日志輸出,其實這種處理日志的方式并不標準。

使用logging模塊控制日志輸出是一個更好地選擇。

為了使用logging模塊記錄日志,我們需要先配置好logging相關的選項。

1) 首先,生成一個日志記錄器,并配置日志等級:

import logging

# 獲取日志記錄器,配置日志等級
logger = logging.getLogger(__name__)
logger.setLevel('DEBUG')

2) 配置日志格式、增加handler控制輸出流:

# 默認日志格式
formatter = logging.Formatter("%(asctime)s - [%(levelname)s] - %(message)s")
# 輸出到控制臺的handler
chlr = logging.StreamHandler()
# 配置默認日志格式
chlr.setFormatter(formatter)

此處可以設置handler所需要處理的日志等級,沒有設置則默認使用logger自身的Level,即DEBUG等級。

3) 最后,將此handler加入到日志記錄器內:

# 日志記錄器增加此handler
logger.addHandler(chlr)

logging 完整配置如下:

import logging

# 獲取日志記錄器,配置日志等級
logger = logging.getLogger(__name__)
logger.setLevel('DEBUG')

# 默認日志格式
formatter = logging.Formatter("%(asctime)s - [%(levelname)s] - %(message)s")
# 輸出到控制臺的handler
chlr = logging.StreamHandler()
# 配置默認日志格式
chlr.setFormatter(formatter)

# 日志記錄器增加此handler
logger.addHandler(chlr)

使用的時候非常簡單,就是把print換成logger.debug即可:

def log(func):
    """
    日志裝飾器,簡單記錄函數的日志

    Args:
        func (function): 函數
    """
    def inner(*args, **kwargs):
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        res = func(*args, **kwargs)
        logger.debug(f"func: {func.__name__} {args} -> {res}")
        return res
    return inner

效果如下:

這樣,一個比較完善的日志裝飾器就完成了。

附常用的日志等級配置:

原文鏈接:https://mp.weixin.qq.com/s/0lbhIAcBCjXNnh49wInYvA

欄目分類
最近更新