python装饰器应用 一行代码为你的函数增加日志服务

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: python装饰器应用 一行代码为你的函数增加日志服务

1 什么是装饰器?

Python修饰器基于闭包原理,是赋予已存在的函数对象额外定制化功能的设计模式,使得代码简洁且易于维护,常用于插入日志、性能测试、权限校验等需求场景。例如某个具有登录功能的函数,现在希望添加数字签证核验功能,即可使用修饰器处理登录函数而无需变更登录函数的底层。Python语法糖@定义了修饰器

2 最通用的例子

def app(func):
    def warp(*args, **kwargs):
        print("正在执行功能1")
        result = func(*args, **kwargs)
        print("正在执行功能2")
        return result
    return warp
@app
def add(a, b):
    return a + b
print(add(1,3))
# 正在执行功能1
# 正在执行功能2
# 4

*args**kwargs用于接收被修饰函数的入口参数,*args、**kwargs分别用于将参数打包成tuple、dict给函数体调用。从上面可以看出,在不修改底层add函数的情况下,可以定制新功能。

3 实现日志打印修饰器

根据修饰器的原理,对上面的例子做小改动如下:

import logging
def log(func):
    def warp(*args, **kwargs):
        try:
            result = func(*args, **kwargs)
            return result
        except Exception as e:
            logging.error(e)
    return warp

这里使用try-except结构可以即使捕获异常信息输出到日志文件。

在某些应用场景,上面的结构还可以改进,比如Web服务可能要在输出日志后给前端反馈一个404代码,因此在增加一个定制化的返回内容err

def logger(err):
    def log(func):
        def warp(*args, **kwargs):
            try:
                result = func(*args, **kwargs)
                return result
            except Exception as e:
                logging.error(e)
                return err
        return warp
    return log

4 配置logging输出格式

import logging, os
'''
* %(asctime)s   即日志记录时间,精确到毫秒
* %(levelname)s 即此条日志级别 
* %(filename)s  即触发日志记录的python文件名
* %(funcName)s  即触发日志记录的函数名
* %(lineno)s    即触发日志记录代码的行号
* %(message)s   即这项调用中的参数
'''
if not os.path.exists('Log.log'):
    file = open('Log.log','w')
logging.basicConfig(
    filename='Log.log',
    format="%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s"
)

5 测试

@logger('加法环节出错了!')
def add(a, b):
  return a + b
# 正常情况
print(add(1, 2))    # 输出3
# 异常情况
print(add(1, '2'))    # 输出“加法环节出错了!”
# Log.log中的记录
2021-10-22 21:34:54,736 - ERROR - test.py - warp - 51 - unsupported operand type(s) for +: 'int' and 'str'

于是只要把上面说的logger函数封装成单独一个文件,在其他位置import logger并用修饰器修饰你希望增加日志功能的函数即可,非常方便

6 附:完整代码

import logging, os
'''
* %(asctime)s   即日志记录时间,精确到毫秒@breif: 
* %(levelname)s 即此条日志级别@param[in]: 
* %(filename)s  即触发日志记录的python文件名@retval: 
* %(funcName)s  即触发日志记录的函数名
* %(lineno)s    即触发日志记录代码的行号
* %(message)s   即这项调用中的参数
'''
if not os.path.exists('Log.log'):
    file = open('Log.log','w')
logging.basicConfig(
    filename='Log.log',
    format="%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s"
)
'''
* @breif: 日志修饰器,为函数添加日志记录服务
* @param[in]: err -> 发生异常时返回的错误信息
* @retval: 加载日志服务的功能函数
'''
def logger(err):
    def log(func):
        def warp(*args, **kwargs):
            try:
                result = func(*args, **kwargs)
                return result
            except Exception as e:
                logging.error(e)
                return err
        return warp
    return log
@logger('出错了')
def add(a, b):
    return a+b
print(add(1,'2'))


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
13天前
|
存储 SQL 监控
|
13天前
|
自然语言处理 监控 数据可视化
|
21天前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化和增强你的函数
【10月更文挑战第24天】在Python编程的海洋中,装饰器是那把可以令你的代码更简洁、更强大的魔法棒。它们不仅能够扩展函数的功能,还能保持代码的整洁性。本文将带你深入了解装饰器的概念、实现方式以及如何通过它们来提升你的代码质量。让我们一起揭开装饰器的神秘面纱,学习如何用它们来打造更加优雅和高效的代码。
|
23天前
|
弹性计算 安全 数据处理
Python高手秘籍:列表推导式与Lambda函数的高效应用
列表推导式和Lambda函数是Python中强大的工具。列表推导式允许在一行代码中生成新列表,而Lambda函数则是用于简单操作的匿名函数。通过示例展示了如何使用这些工具进行数据处理和功能实现,包括生成偶数平方、展平二维列表、按长度排序单词等。这些工具在Python编程中具有高度的灵活性和实用性。
|
26天前
|
Python
python的时间操作time-函数介绍
【10月更文挑战第19天】 python模块time的函数使用介绍和使用。
27 4
|
27天前
|
存储 Python
[oeasy]python038_ range函数_大小写字母的起止范围_start_stop
本文介绍了Python中`range`函数的使用方法及其在生成大小写字母序号范围时的应用。通过示例展示了如何利用`range`和`for`循环输出指定范围内的数字,重点讲解了小写和大写字母对应的ASCII码值范围,并解释了`range`函数的参数(start, stop)以及为何不包括stop值的原因。最后,文章留下了关于为何`range`不包含stop值的问题,留待下一次讨论。
19 1
|
10天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
40 11
|
1月前
|
测试技术 Python
Python中的装饰器:从入门到精通
【10月更文挑战第7天】本文旨在通过浅显易懂的方式,向读者介绍Python中装饰器的概念、用法和高级应用。我们将从装饰器的定义开始,逐步深入到如何创建和使用装饰器,最后探讨装饰器在实战中的应用。文章将结合代码示例,帮助读者更好地理解和掌握这一强大的工具。
|
1月前
|
缓存 开发者 Python
探索Python中的装饰器:从入门到实践
【9月更文挑战第36天】装饰器,在Python中是一种特殊的语法糖,它允许你在不修改原有函数代码的情况下,增加额外的功能。本文将通过浅显易懂的语言和实际代码示例,带你了解装饰器的基本原理,探索其背后的魔法,并展示如何在实际项目中运用这一强大工具。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往更高效、更优雅代码的大门。
59 11
|
6天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
19 3