基于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模块中多个类的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • peewee创建连接前的前置操作wireshark抓包实现

    peewee创建连接前的前置操作wireshark抓包实现

    这篇文章主要为大家介绍了peewee创建连接前的前置操作wireshark 抓包实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Python 定义只读属性的实现方式

    Python 定义只读属性的实现方式

    这篇文章主要介绍了Python 定义只读属性的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 基于Python实现在线加密解密网站系统

    基于Python实现在线加密解密网站系统

    在这个数字化时代,数据的安全和隐私变得越来越重要,所以本文小编就来带大家实现一个简单但功能强大的加密解密系统,并深入探讨它是如何工作的,有兴趣的可以了解下
    2023-09-09
  • Python&Matla实现模拟退火法的示例代码

    Python&Matla实现模拟退火法的示例代码

    模拟退火和蒙特卡洛实验一样,本文主要介绍了Python&Matla实现模拟退火法的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Python数据分析之如何利用pandas查询数据示例代码

    Python数据分析之如何利用pandas查询数据示例代码

    查询和分析数据是pandas的重要功能,也是我们学习pandas的基础,下面这篇文章主要给大家介绍了关于Python数据分析之如何利用pandas查询数据的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • 提升Python代码质量巧妙整理包引入顺序

    提升Python代码质量巧妙整理包引入顺序

    在Python编程中,优化导入包的顺序可以提高代码的可读性、可维护性和性能,一个良好的导入顺序不仅使代码更易于理解,还可以帮助减少潜在的循环依赖和提高导入速度,本文将介绍如何快速、有效地优化Python导入包的顺序,并提供丰富的示例代码以帮助更好地理解
    2024-01-01
  • Python实现将内容写入文件的五种方法总结

    Python实现将内容写入文件的五种方法总结

    本篇带你详细看一下python将内容写入文件的方法以及细节,主要包括write()方法、writelines() 方法、print() 函数、使用 csv 模块、使用 json 模块,需要的可以参考一下
    2023-04-04
  • django写单元测试的方法

    django写单元测试的方法

    这篇文章主要介绍了django写单元测试的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Python实现列表中非负数保留,负数转化为指定的数值方式

    Python实现列表中非负数保留,负数转化为指定的数值方式

    这篇文章主要介绍了Python实现列表中非负数保留,负数转化为指定的数值方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06

最新评论