python进阶 -- 日志装饰器详解

日志

日志:记录程序运行的时候,出现的问题,或者说验证流程是否正常
在实际工作中,python的脚本命令一般是放在服务器执行的linux系统
日志其实就是记录程序运行时出现的问题、或者正常的打印,协助出现问题的时解决排查问题

python中内置的日志模块可以直接导入:

import logging

日志模块:会有日志的级别设置
级别是自己设置的,可以通过自定义的级别去确定什么东西该被记录,什么东西部该被记录

注意:设置日志级别的时候,单词全部需要大写

● DEBUG:等级最高,包含debug、info、warning、error的4种全部日志
● INFO:不包含debug日志
● WARING:不包含debug、info日志
● ERROR:不包含debug、info、warning日志
如果需要调整日志级别,level=logging.后面修改即可 

简单使用示例

import logging

logging.basicConfig(level=logging.INFO) #设置日志的打印级别

def fun1():
    logging.debug("debug打印")
    logging.info("info打印")
    logging.warning("warning打印")
    logging.error("error打印")
fun1()

 通常,在写代码的时候,我们会将一段段的代码执行结果加上日志的输出,方便在本地查看代码是否执行成功

例如:现在有一段业务逻辑代码,在执行这段代码的同时加上日志的输出

import logging

logging.basicConfig(level=logging.INFO) #设置日志的打印级别

def fun1():
    logging.debug("debug打印")
    logging.info("info打印")
    logging.warning("warning打印")
    logging.error("error打印")
#fun1()


def fun2(func_name):
    func_name()  #调用传入的函数本体
    print("这是fun2函数的调用")

fun2(fun1)

方式1:代码如上,在fun2函数调用时,括号内加上fun1这个函数名即可 

方式2:
fun2的输出内容中,fun2的原本内容与fun1的内容没有先后顺序,是并行的

所以也可以写成:最后调用时,函数1(函数3),如下:

import logging

logging.basicConfig(level=logging.INFO) #设置日志的打印级别


def log_info(fun_name):
    logging.info("日志开始记录")
    fun_name()
    logging.info("函数执行结束")

def fun3():
    print("fun3代码执行")

log_info(fun3)

方式3:用一个变量接收,然后调用新的变量名

import logging

logging.basicConfig(level=logging.INFO) #设置日志的打印级别

def log(fun_name):
    def wrapper():
        logging.info("日志开始记录")
    return wrapper  #不加括号,只是获取了wrapper这个函数的内存地址

def fun4():
    print("fun5函数执行")

method = log(fun_name=fun4)
method()  #但输出只完成了一半,并没有输出fun4的内容打印

装饰器

装饰器是Python中一种强大的编程工具,它可以用于修改、包装或扩展函数或方法的行为。装饰器本质上是一个函数,它接受一个函数作为输入,并返回一个新的函数或修改后的函数。装饰器通常用于在不修改原始函数代码的情况下,为函数添加额外的功能。

作用:

  1. 代码复用:装饰器可以用来封装通用的功能,例如日志记录、性能分析、权限检查等,以便在多个函数中重复使用。
  2. 代码修改:装饰器可以在不修改原始函数代码的情况下,对函数的行为进行修改,例如添加新的前置或后置处理逻辑。
  3. 元编程:装饰器本身是元编程的一种形式,它允许在运行时动态地修改函数或方法的行为。

装饰器的使用

接着上面的栗子,看看加上装饰器之后的代码: 

步骤:在fun5的头部加一个@函数名称,函数名称即装饰器的函数名称
在自动化的框架里面,有很多装饰器的应用,以及可以自定义装饰器去完成调用
import logging

logging.basicConfig(level=logging.INFO) #设置日志的打印级别


    def wrapper():
        logging.info("日志开始记录")
        fun()
    return wrapper  #不加括号,只是获取了wrapper这个函数的内存地址

@log   #默认会把fun5的函数本体,传入到装饰器的参数里去
def fun5():
    print("fun5函数执行")

fun5()

函数与装饰器一对多使用

一个函数是否可以使用多个装饰器?

一个函数使用了多个装饰器,执行的顺序是什么?

一起来看个案例:

def fun1(fun1_name):
    def fun2():
        print("fun1装饰器调用")
        fun1_name()
    return fun2


def fun2(fun2_name):
    def fun3():
        print("fun2装饰器调用")
        fun2_name()
    return fun3

@fun2
@fun1
def fun4():
    print("fun4函数调用")

fun4()

所以:

一个函数,可以使用多个装饰器

如果一个函数使用了多个装饰器,执行顺序,是按照装饰器的顺序,从上往下执行的 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

以太网交换机——稳定安全,构筑数据之桥

交换机,起源于集线器和网桥等网络通信设备,它在性能和功能上有了很大的发展,因此逐渐成为搭建网络环境的常用的设备。 随着ChatGPT爆发,因为用户量激增而宕机事件频频发生,云计算应用催生超大规模算力需求,…

kubernetes Namespace Labels 详解

写在前面:如有问题,以你为准, 目前24年应届生,各位大佬轻喷,部分资料与图片来自网络 内容较长,页面右上角目录方便跳转 namespace 实现资源分组,label实现业务分组 Namespace 基础理论 最重…

Spring AOP(详解)

目录 1.AOP概述 2.AOP相关术语 3.Spring AOP的原理机制 3.1JDK动态代理 3.2 CGLIB动态代理 3.3简单代码展示 3.3.1JDK动态代理 3.3.2CGLIB动态代理 4.Spring的AOP配置 4.1pom.xml 4.2增强方法 4.3切点 4.4切面 5.基于注解的AOP配置 5.1.创建工程 5.2.增强 5.3AOP…

使用flet创建todo应用

使用 Flet 在 Python 中创建待办事项应用 Create To-Do app in Python with Flet 翻译官网教程https://flet.dev/docs/tutorials/python-todo,对一些地方进行了注释和修改。 安装flet Python版本需要3.8及以上,使用pip安装: pip install…

YY9706.102-2021 医疗设备EMC检测知识-RE

一:RE(辐射发射试验) 按照GB 4824 6.2.2电磁辐射骚扰限值描述,在相对应的实验室和距离测量时,选择不同的限值进行测量。 以上只列出了1组的A、B类限值,2组设备的限值在6.3章节有介绍,对于我们的…

Backtrader 文档学习-Strategy(下)

Backtrader 文档学习-Strategy(下) 1. notify_cashvalue # 测试 #notify_cashvalue 方法特点 class Test_Strategy(bt.Strategy): # 策略通用初始参数params ((maperiod1, 5),(maperiod2, 20),(printlog, True), # 写入日志标志(logfilename, Test_…

Vue-8、Vue事件处理

1、点击事件 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml" xmlns:v-bind"http://www.w3.org/1999/xhtml"xmlns:v-on"http://www.w3.org/1999/xhtml"> <head><meta charset&quo…

计算机网络—— 概述

概述 1.1 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网&#xff08;或互连网&#xff09;。因特网&#xff08;Internet&#xff09;是世…

react输入框检索树形(tree)结构

input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容&#xff0c;tree是多维数组&#xff0c;一级一级的对比输入的内容是否匹配&#xff0c;用forEach循环遍历数据&#xff0c;匹配不到在往下找&#xff0c;直到找到为null &#x…

求求你,别再乱用@Transactional了

求求你&#xff0c;别再乱用Transactional了 文章目录 &#x1f50a;先看个问题&#x1f4d5;情况1情况1结果 &#x1f5a5;️情况2情况2结果 &#x1f4dc; 情况三情况3结果 &#x1f4d8;情况4情况4结果 &#x1f516;先说结论情况1结果情况2结果情况3结果情况4结果&#x1f…

oracle 12c pdb expdp/impdp 数据导入导出

环境 (源)rac 环境 byoradbrac 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;172.17.38.45 (目的&am…

2024年中职网络安全——Windows操作系统渗透测试(Server2105)

Windows操作系统渗透测试 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2105服务器场景操作系统&#xff1a;Windows&#xff08;版本不详&#xff09;&#xff08;封闭靶机&#xff09;需要环境加Q 目录 1.通过本地PC中渗透测试平台Kali对服务器场景进行系统服务…

区块链金融科技:技术融合与挑战应对【文末送书-16】

文章目录 前言一.区块链与金融科技的融合&#xff1a;革新金融格局的技术之光1.1区块链技术简介1.2 区块链在金融科技中的应用 二.智能合约2.1 去中心化金融&#xff08;DeFi&#xff09;2.2区块链对金融科技的影响2.3数据安全性 三.区块链与金融科技【文末送书-16】3.1 粉丝福…

spring Security源码讲解-Sevlet过滤器调用springSecurty过滤器的流程

承接上文 上一节 http://t.csdnimg.cn/ueSAl 最后讲到了过滤器收集完成注入容器&#xff0c;这节我们来讲Security的Filter是怎么被Spring调用的。 我们先看webSecurity的performBuild方法(), ![在这里插入图片描述](https://img-b 也就是说&#xff0c;最终返回的过滤器对象…

如何利用大语言模型(LLM)打造定制化的Embedding模型

一、前言 在探索大语言模型&#xff08;LLM&#xff09;应用的新架构时&#xff0c;知名投资公司 Andreessen Horowitz 提出了一个观点&#xff1a;向量数据库是预处理流程中系统层面上最关键的部分。它能够高效地存储、比较和检索高达数十亿个嵌入&#xff08;也就是向量&…

解码 Elasticsearch 查询 DSL:利用 Elasticsearch 中的 has_child 和 has_parent 查询进行父子文档搜索

今天&#xff0c;让我们深入研究 has_child 查询和 has_parent 查询&#xff0c;这将帮助我们将 2 个不同的文档组合到一个索引中&#xff0c;从而使我们能够将它们与关系关联起来。 这样做会对我们搜索相关文档时有很大帮助。 在使用 has_child 及 has_parent 这种关系时&…

解决 rasa 中 slot 不能为中文的问题

解决 rasa 中 slot 不能为中文的问题 定位问题解决办法 定位问题 slots:姓名:type: textmappings:- type: custom如上的 slot 配置&#xff0c;在 rasa train 时会报以下错误&#xff1a; YamlValidationException: Failed to validate D:\project\python\rasa_test\y\domain…

Ansys Zemax | 如何使用 ZPL 创建用户自定义求解

附件下载 联系工作人员获取附件 本文使用两个示例演示了如何使用 ZPL 创建用户自定义解。第一个示例介绍了如何创建 ZPL 解以确保序列文件中像面的曲率半径等于系统的 Petzval 曲率。第二个示例介绍了如何在非序列元件编辑器 ( Non-Sequential Component Editor ) 中基于其他…

实战:使用docker容器化服务与文件挂载-2

接着上文&#xff0c;演示Elasticsearch 和 Kibana 的安装&#xff0c;并讲解文件挂载 Elasticsearch of Docker &#xff08;Kibana&#xff09; 1、Elasticsearch 安装 ElasticSearch 使用 Docker 安装&#xff1a;https://www.yuque.com/zhangshuaiyin/guli-mall/dwrp5b 1.…

C++ 实现十大排序算法

教你手撕排序&#xff0c;这里有一个概念就是稳定排序。假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;r[i]r[j]&#xff0c;且r[i]在r[j]之前&#…