最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python編寫簡單實(shí)用的日志裝飾器

 更新時(shí)間:2022年05月20日 09:37:07   作者:Ckend  
在寫代碼的時(shí)候,往往會(huì)漏掉日志這個(gè)關(guān)鍵因素,導(dǎo)致功能在使用的時(shí)候出錯(cuò)卻無法溯源。這個(gè)時(shí)候只要利用日志裝飾器就能解決,本文將用Python自制一個(gè)簡單實(shí)用的日志裝飾器,需要的可以參考一下

在寫代碼的時(shí)候,往往會(huì)漏掉日志這個(gè)關(guān)鍵因素,導(dǎo)致功能在使用的時(shí)候出錯(cuò)卻無法溯源。

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

1.簡陋版裝飾器

寫一個(gè)裝飾器非常簡單,因?yàn)楸举|(zhì)上裝飾器就是一個(gè)返回函數(shù)的“高階”函數(shù)而已:

1) 函數(shù)作為參數(shù)傳遞進(jìn)裝飾器。

2) 裝飾器內(nèi)定義一個(gè)函數(shù),處理作為參數(shù)傳遞進(jìn)來的函數(shù)。

3) 返回這個(gè)裝飾器內(nèi)定義的函數(shù)

import datetime

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

    Args:
        func (function): 函數(shù)
    """
    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)

效果如下:

雖然這樣可以實(shí)現(xiàn)我們所需要的功能,但其實(shí)有很大的優(yōu)化空間。

2.普通版裝飾器

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

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

修改如下:

import datetime

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

    Args:
        func (function): 函數(shù)
    """
    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

似乎優(yōu)化得差不多了,不過依然存在改進(jìn)空間。

3.優(yōu)化版裝飾器

在前兩版代碼中,我們使用print進(jìn)行日志輸出,其實(shí)這種處理日志的方式并不標(biāo)準(zhǔn)。

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

為了使用logging模塊記錄日志,我們需要先配置好logging相關(guān)的選項(xiàng)。

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

import logging

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

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

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

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

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

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

logging 完整配置如下:

import logging

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

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

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

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

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

    Args:
        func (function): 函數(shù)
    """
    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

效果如下:

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

附常用的日志等級配置:

以上就是基于Python編寫簡單實(shí)用的日志裝飾器的詳細(xì)內(nèi)容,更多關(guān)于Python日志裝飾器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 總結(jié)python實(shí)現(xiàn)父類調(diào)用兩種方法的不同

    總結(jié)python實(shí)現(xiàn)父類調(diào)用兩種方法的不同

    最近在工作中實(shí)現(xiàn)父類調(diào)用的時(shí)候發(fā)現(xiàn)了一個(gè)錯(cuò)誤,然后通過分析實(shí)踐總結(jié)出來了,下面這篇文章主要給大家總結(jié)了python中實(shí)現(xiàn)父類調(diào)用兩種方法的不同之處,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 在Spyder中如何導(dǎo)入項(xiàng)目

    在Spyder中如何導(dǎo)入項(xiàng)目

    文章介紹了在Spyder中導(dǎo)入已存在項(xiàng)目時(shí)遇到的錯(cuò)誤及解決方法,通過創(chuàng)建新項(xiàng)目并復(fù)制`.spyproject`文件夾到已存在項(xiàng)目中,可以成功導(dǎo)入項(xiàng)目,此外,還提到如何在Spyder中顯示項(xiàng)目資源管理器
    2025-01-01
  • python實(shí)現(xiàn)猜拳游戲

    python實(shí)現(xiàn)猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • python leetcode 字符串相乘實(shí)例詳解

    python leetcode 字符串相乘實(shí)例詳解

    這篇文章主要介紹了python leetcode 字符串相乘的示例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • python 產(chǎn)生token及token驗(yàn)證的方法

    python 產(chǎn)生token及token驗(yàn)證的方法

    今天小編就為大家分享一篇python 產(chǎn)生token及token驗(yàn)證的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 在Django中同時(shí)使用多個(gè)配置文件的方法

    在Django中同時(shí)使用多個(gè)配置文件的方法

    這篇文章主要介紹了在Django中同時(shí)使用多個(gè)配置文件的方法,Django是豐富多彩的Python web框架中人氣最高的一個(gè),需要的朋友可以參考下
    2015-07-07
  • Python的3種運(yùn)行方式:命令行窗口、Python解釋器、IDLE的實(shí)現(xiàn)

    Python的3種運(yùn)行方式:命令行窗口、Python解釋器、IDLE的實(shí)現(xiàn)

    這篇文章主要介紹了Python的3種運(yùn)行方式:命令行窗口、Python解釋器、IDLE的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • python日志模塊loguru詳解

    python日志模塊loguru詳解

    大家好,本篇文章主要講的是python日志模塊loguru詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 利用keras加載訓(xùn)練好的.H5文件,并實(shí)現(xiàn)預(yù)測圖片

    利用keras加載訓(xùn)練好的.H5文件,并實(shí)現(xiàn)預(yù)測圖片

    今天小編就為大家分享一篇利用keras加載訓(xùn)練好的.H5文件,并實(shí)現(xiàn)預(yù)測圖片,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • pandas分組排序 如何獲取第二大的數(shù)據(jù)

    pandas分組排序 如何獲取第二大的數(shù)據(jù)

    這篇文章主要介紹了pandas分組排序 獲取第二大的數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論

通海县| 通辽市| 富锦市| 定州市| 会理县| 汨罗市| 潼关县| 阿城市| 大丰市| 龙岩市| 中山市| 明光市| 云阳县| 安徽省| 慈溪市| 巴彦淖尔市| 千阳县| 慈利县| 平湖市| 察哈| 尼玛县| 台前县| 平遥县| 吉木萨尔县| 阳新县| 抚宁县| 蓬安县| 武城县| 衡东县| 富阳市| 罗城| 江北区| 元朗区| 安溪县| 安顺市| 寿光市| 皋兰县| 岢岚县| 获嘉县| 敦煌市| 岚皋县|