基于Python编写简单实用的日志装饰器

 更新时间:2022年05月20日 09:37:07   作者:Ckend  
在写代码的时候,往往会漏掉日志这个关键因素,导致功能在使用的时候出错却无法溯源。这个时候只要利用日志装饰器就能解决,本文将用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

效果如下:

这样,一个比较完善的日志装饰器就完成了。

附常用的日志等级配置:

以上就是基于Python编写简单实用的日志装饰器的详细内容,更多关于Python日志装饰器的资料请关注脚本之家其它相关文章!

相关文章

  • 总结python实现父类调用两种方法的不同

    总结python实现父类调用两种方法的不同

    最近在工作中实现父类调用的时候发现了一个错误,然后通过分析实践总结出来了,下面这篇文章主要给大家总结了python中实现父类调用两种方法的不同之处,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • 在Spyder中如何导入项目

    在Spyder中如何导入项目

    文章介绍了在Spyder中导入已存在项目时遇到的错误及解决方法,通过创建新项目并复制`.spyproject`文件夹到已存在项目中,可以成功导入项目,此外,还提到如何在Spyder中显示项目资源管理器
    2025-01-01
  • python实现猜拳游戏

    python实现猜拳游戏

    这篇文章主要为大家详细介绍了python实现猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • python leetcode 字符串相乘实例详解

    python leetcode 字符串相乘实例详解

    这篇文章主要介绍了python leetcode 字符串相乘的示例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • python 产生token及token验证的方法

    python 产生token及token验证的方法

    今天小编就为大家分享一篇python 产生token及token验证的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 在Django中同时使用多个配置文件的方法

    在Django中同时使用多个配置文件的方法

    这篇文章主要介绍了在Django中同时使用多个配置文件的方法,Django是丰富多彩的Python web框架中人气最高的一个,需要的朋友可以参考下
    2015-07-07
  • Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现

    Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现

    这篇文章主要介绍了Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • python日志模块loguru详解

    python日志模块loguru详解

    大家好,本篇文章主要讲的是python日志模块loguru详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 利用keras加载训练好的.H5文件,并实现预测图片

    利用keras加载训练好的.H5文件,并实现预测图片

    今天小编就为大家分享一篇利用keras加载训练好的.H5文件,并实现预测图片,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • pandas分组排序 如何获取第二大的数据

    pandas分组排序 如何获取第二大的数据

    这篇文章主要介绍了pandas分组排序 获取第二大的数据的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论