基于Python編寫簡單實用的日志裝飾器
在寫代碼的時候,往往會漏掉日志這個關(guān)鍵因素,導(dǎo)致功能在使用的時候出錯卻無法溯源。
其實,只需要寫一個非常簡單的日志裝飾器,我們就能大大提升排查問題的效率。
1.簡陋版裝飾器
寫一個裝飾器非常簡單,因為本質(zhì)上裝飾器就是一個返回函數(shù)的“高階”函數(shù)而已:
1) 函數(shù)作為參數(shù)傳遞進(jìn)裝飾器。
2) 裝飾器內(nèi)定義一個函數(shù),處理作為參數(shù)傳遞進(jìn)來的函數(shù)。
3) 返回這個裝飾器內(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)效果如下:

雖然這樣可以實現(xiàn)我們所需要的功能,但其實有很大的優(yōu)化空間。
2.普通版裝飾器
第一版代碼中有一個顯而易見的問題,裝飾器內(nèi)定義的處理函數(shù)不支持kwargs,而在裝飾器中支持kwargs僅僅是舉手之勞而已。
第二個問題是,生成時間戳的時候采用字符串截取的形式,這種形式過于粗暴。其實可以使用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)行日志輸出,其實這種處理日志的方式并不標(biāo)準(zhǔn)。
使用logging模塊控制日志輸出是一個更好地選擇。
為了使用logging模塊記錄日志,我們需要先配置好logging相關(guān)的選項。
1) 首先,生成一個日志記錄器,并配置日志等級:
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)使用的時候非常簡單,就是把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效果如下:

這樣,一個比較完善的日志裝飾器就完成了。
附常用的日志等級配置:

以上就是基于Python編寫簡單實用的日志裝飾器的詳細(xì)內(nèi)容,更多關(guān)于Python日志裝飾器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python如何把字符串類型list轉(zhuǎn)換成list
關(guān)于keras.layers.Conv1D的kernel_size參數(shù)使用介紹
Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用

