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

news2024/9/22 23:23:00

日志

日志:记录程序运行的时候,出现的问题,或者说验证流程是否正常
在实际工作中,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()

所以:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[书生·浦语大模型实战营]——基于 InternLM 和 LangChain 搭建你的知识库

0. 背景知识 0.1 InternLM InternLM 是一个开源的轻量级训练框架,旨在支持大模型训练而无需大量的依赖。通过单一的代码库,它支持在拥有数千个 GPU 的大型集群上进行预训练,并在单个 GPU 上进行微调,同时实现了卓越的性能优化。…

分析一个项目(微信小程序篇)二

目录 首页: 发现: 购物车: 我的: 分析一个项目讲究的是如何进行对项目的解析分解,进一步了解项目的整体结构,熟悉项目的结构,能够知道每个组件所处在哪个位置,发挥什么作用。 接…

CRM系统是否适合企业,有哪些判断标准?

现如今,以客户为中心不再是一句空话,哪个企业能与客户建立长久的关系,那它就能获得业绩的增长。CRM管理系统的初衷就是维护客户关系,通过深入了解客户,提高转化率,并推动业绩增长。企业在选型时&#xff0c…

游戏引擎巨头Unity 裁员 25%;章泽天净资产600亿;恒大汽车刘永灼被抓;抖音将“抖币”更名为“钻石”;董宇辉新账号将于今晚首播

今日精选 • 游戏引擎巨头 Unity 计划裁员 25%,去年底曾关闭全球多处办公室• 恒大汽车刘永灼被抓,股价闪崩20%,刚丢35亿救命钱• 抖音将“抖币”更名为“钻石”• 章泽天登胡润财富榜:净资产600亿• 董宇辉新账号未开播已有400万…

React Native集成到现有原生应用

本篇文章以MacOS环境开发iOS平台为例,记录一下在原生APP基础上集成React Native React Native中文网 详细介绍了搭建环境和集成RN的步骤。 环境搭建 必须安装的依赖有:Node、Watchman、Xcode 和 CocoaPods。 安装Homebrew Homebrew是一款Mac OS平台下…

【QT-UI】

1.使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), …

36-javascript输出方式,弹框:普通,confirm弹框,prompt弹框,控制台输出:普通,warm,error

1.页面打印 <body><p>你真是一个小机灵鬼</p><script>// 页面打印document.write("打印内容");</script> </body> 2.覆盖文档 <body><p>你真是一个小机灵鬼</p><script>// 覆盖文档window.onload f…

TinkerBoard2跑BuildRoot

我的主板没有EMMC&#xff0c;只能烧录到TF卡 3.1、格式化TF卡 使用$ sudo fdisk -l查看设备&#xff0c;找到对应的设备路径&#xff0c;如/dev/sdd 使用$ sudo fdisk /dev/sdd命令格式化 d //删除分区 n //新建分区 3.2、使用SD_Firmware_Tool烧录固件 我用的是SD_Firmwar…

Spring——Spring整合MyBatis

Spring整合MyBatis 1.创建工程 1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

R语言频率分布直方图绘制教程

本篇笔记分享R语言绘制直方图的方法&#xff0c;通过多种展示风格对数据进行可视化&#xff0c;主要用到ggplot、ggpubr等包。 什么是直方图&#xff1f; 直方图(Histogram)&#xff0c;又称质量分布图&#xff0c;是一种统计报告图&#xff0c;由一系列高度不等的柱子表示数…

前端适配750px设计稿

全局引入 (function(doc, win) {const docEl doc.documentElement,resizeEvt orientationchange in window ? orientationchange : resizeconst setFont function() {let clientWidth docEl.clientWidth;if (!clientWidth) return;if (clientWidth > 750) {docEl.styl…

社科院与美国杜兰大学金融管理硕士项目——金融在职人员的当下与未来

随着经济的蓬勃发展和全球化的疾驰&#xff0c;金融行业已稳坐现代经济的心脏位置。在这翻涌的时代浪潮中&#xff0c;金融从业人员的重要性愈发突出&#xff0c;他们不仅是企业的坚实支柱&#xff0c;更是推动经济前行的强大引擎。然而&#xff0c;科技进步和市场变幻的风云也…

深度解析Dubbo的基本应用与高级应用:负载均衡、服务超时、集群容错、服务降级、本地存根、本地伪装、参数回调等关键技术详解

负载均衡 官网地址&#xff1a; http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/ 如果在消费端和服务端都配置了负载均衡策略&#xff0c; 以消费端为准。 这其中比较难理解的就是最少活跃调用数是如何进行统计的&#xff1f; 讲道理&#xff0c; 最少活跃数…

TSP(Python):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

批量剪辑方法:掌握视频剪辑技巧,按指定时长轻松分割视频

在视频制作和编辑过程中&#xff0c;经常要批量处理和剪辑大量的视频片段。学会批量剪辑方法可以提高工作效率&#xff0c;还可以使视频编辑更加准确和高效。下面来看下云炫AI智剪如何按指定时长轻松分割视频的批量剪辑方法。 分割后的视频文件效果&#xff0c;已分割分段的视…

一、Mybatis 简介

本章概要 简介持久层框架对比快速入门&#xff08;基于Mybatis3方式&#xff09; 1.1 简介 https://mybatis.org/mybatis-3/zh/index.html MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投G…

Prometheus实战篇:Prometheus监控mongodb

Prometheus实战篇:Prometheus监控mongodb 准备环境 docker-compose安装mongodb docker-compose.yaml version: 3 services:mongo:image: mongo:4.2.5container_name: mongorestart: alwaysvolumes:- /data/mongo/db: /data/dbport:- 27017:27017command: [--auth]enviromen…

搭建一个手游平台的价格大概是多少?

随着智能手机的普及和移动互联网的发展&#xff0c;手游行业呈现出爆炸性的增长。许多人都看到了手游市场的巨大潜力&#xff0c;并考虑搭建一个自己的手游平台。那么&#xff0c;搭建一个手游平台的价格大概是多少呢&#xff1f; 首先&#xff0c;我们需要明确手游平台的搭建涉…

Halcon灰度共生矩阵

Halcon灰度共生矩阵 图像的纹理一般具有重复性&#xff0c;纹理单元往往会以一定的规律出现在图像的不同位置&#xff0c;即使存在一些形变或者方向上的偏差&#xff0c;图像中一定距离之内也往往有灰度一致的像素点&#xff0c;这一特性适合用灰度共生矩阵来表现。 灰度共生矩…

软件测试|Django 入门:构建Python Web应用的全面指南

引言 Django 是一个强大的Python Web框架&#xff0c;它以快速开发和高度可扩展性而闻名。本文将带您深入了解Django的基本概念和核心功能&#xff0c;帮助您从零开始构建一个简单的Web应用。 什么是Django&#xff1f; Django 是一个基于MVC&#xff08;模型-视图-控制器&a…