当前位置: 首页 > news >正文

Python不会调试不够丝滑?那事你不会logging---剖析!

前言:

一直都是手动debug进行调试,F8都按烂了;最近用logging进行提前布置,发现这样更能让代码走得丝滑,同时也能尽早发现问题!

基本概念:


Logger - 日志记录接口
Handler - 确定日志记录发送到不同的地方(文件、控制台等)
Level - 定义了日志的严重性级别(DEBUG、INFO、WARNING、ERROR、CRITICAL)
Formatter - 定义日志的布局,即格式

举例子(logging模块,简单):

import logging# 配置日志基础参数:级别和格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 创建一个logger
logger = logging.getLogger(__name__)# 日志消息示例
logger.debug('这是 debug 级别的日志,通常用于调试')
logger.info('这是 info 级别的日志,常规操作消息')
logger.warning('这是 warning 级别的日志,指示有潜在问题')
logger.error('这是 error 级别的日志,标识操作中的严重问题')
logger.critical('这是 critical 级别的日志,指严重的错误')# 输出将会是info及以上级别的日志,因为配置了level=logging.INFO
请注意这个例子中,只有INFO级别及以上级别的日志信息(Default level)会被输出到控制台,因为我们在basicConfig中设置了级别为INFO。如果需要将消息存储在文件中,而不是在控制台输出,则需要将handers添加到logger中。如果同时将日志打印至控制台和写入文件,可以另外添加StreamHandler和FileHandler到你的logger。

举例子(输出到控制台和文件):

import logging# 首先,创建一个Logger对象
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)  # 设置捕捉所有级别日志# 接着,创建Formatter对象以设定日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')# 创建一个StreamHandler实例用于输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)  # 设置只输出INFO级别及以上的日志到控制台
console_handler.setFormatter(formatter)  # 应用日志格式# 创建一个FileHandler实例用于写入文件,例如写入example.log
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)  # 设置记录DEBUG级别及以上的日志到文件
file_handler.setFormatter(formatter)  # 应用日志格式# 添加之前创建的Handler至logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)# 记录不同级别日志的示例
logger.debug('这是DEBUG级别的信息,因为FileHandler设置为DEBUG级别,所以它能记录在文件里。')
logger.info('这是INFO级别的信息,Info级别的日志会输出在控制台。')
logger.warning('这是WARNING级别的信息,会既出现在控制台也会记录在文件中。')
logger.error('这是ERROR级别的信息,会既出现在控制台也会记录在文件中。')
logger.critical('这是CRITICAL级别的信息,会既出现在控制台也会记录在文件中。')#  现在,在控制台上将会看到INFO及更高级别的日志,
#  而在“example.log”文件中将会看到DEBUG及更高级别的日志。
级别为DEBUG以上的日志会被写入example.log文件,而控制台只会显示INFO级别及以上的日志信息。通过调整setLevel方法的参数,你可以自定义不同Handler所处理的日志级别。记得最后调用addHandler方法将handler添加至logger。


 




最后经验分享:

在生产中应用:

在生产环境中不要使用print语句,而应该使用一个配置良好的日志系统;这能够提供灵活的日志管理。

避免过多无关日志:

过多的日志可以隐藏真正重要的信息,合理设定日志级别,捕获关键信息。

异步/队列日志记录:

高并发应用中,考虑使用异步方式记录日志或者使用消息队列来减少日志记录对性能的影响。

相关文章:

Python不会调试不够丝滑?那事你不会logging---剖析!

前言: 一直都是手动debug进行调试,F8都按烂了;最近用logging进行提前布置,发现这样更能让代码走得丝滑,同时也能尽早发现问题! 基本概念: Logger - 日志记录接口 Handler - 确定日志记录发送到不同的地方(文件、控制台等) Level - 定义了日…...

OpenAI的Whisper蒸馏:蒸馏后的Distil-Whisper速度提升6倍

1 Distil-Whisper诞生 Whisper 是 OpenAI 研发并开源的一个自动语音识别(ASR,Automatic Speech Recognition)模型,他们通过从网络上收集了 68 万小时的多语言(98 种语言)和多任务(multitask&am…...

Ubuntu18.04安装LeGO-LOAM保姆级教程

系统环境:Ubuntu18.04.6 LTS 1.LeGO-LOAM的安装前要求: 1.1 ROS安装:参考我的另一篇博客Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客文章浏览阅读168次。Ubuntu18.04安装ROS-melodic保姆级教程https://blog.csdn.net/…...

git修改commit历史提交时间、作者

1、修改最近的几条记录,进入提交记录列表,修改提交记录模式 git rebase -i HEAD~3 // 修改最近的三条记录,顺序排列按提交时间升序 指令说明: pick:保留该commit(缩写:p) reword&#xff1a…...

【C++历练之路】list的重要接口||底层逻辑的三个封装以及模拟实现

W...Y的主页 😊 代码仓库分享💕 🍔前言: 在C的世界中,有一种数据结构,它不仅像一个神奇的瑰宝匣,还像一位能够在数据的海洋中航行的智慧舵手。这就是C中的list,一个引人入胜的工具…...

Kubeadm部署Kubernetes Containerd集群

文章目录 概述一、硬件系统二、基础配置设置主机名配置主机名与IP地址解析关闭防火墙与selinux时间同步(ntp)升级系统内核配置内核转发及网桥过滤*安装ipset及ipvsadm关闭SWAP分区 三、Containerd准备Containerd获取下载解压Containerd配置文件生成并修改Containerd启动及开机自…...

OpenCV入门9——目标识别(车辆统计)

文章目录 图像轮廓查找轮廓绘制轮廓轮廓的面积与周长多边形逼近与凸包外接矩形项目总览【车辆统计】视频加载【车辆统计】去背景【车辆统计】形态学处理【车辆统计】逻辑处理【车辆统计】显示信息【车辆统计】 图像轮廓 查找轮廓 # -*- coding: utf-8 -*- import cv2 import n…...

2023前端大厂高频面试题之JavaScript篇(5)

系列文章: 2023前端大厂高频面试题之JavaScript篇(1) 2023前端大厂高频面试题之JavaScript篇(2) 2023前端大厂高频面试题之JavaScript篇(3) 2023前端大厂高频面试题之JavaScript篇(4) 2023前端大厂高频面试题之JavaScript篇(5) 2023前端大厂高频面试题之HTML篇 2023前端大厂高…...

物联网网关在工业行业的应用案例

物联网网关在工业行业的应用案例 随着物联网技术的不断发展,物联网网关在工业行业的应用越来越广泛。本文将介绍一个物联网网关在工业行业的应用案例,以期为相关领域的研究和实践提供借鉴和启示。 一、案例背景 某大型制造企业是一家全球知名的汽车制…...

5、基础入门——资产架构端口应用WAF站库分离负载均衡

资产架构 目录型网站安全:一个IP对应一个域名(bbs.xiaodi8.com),该域名(bbs.xiaodi8.com)下有一个网站,该域名的某个目录下(bbs.xiaodi8.com/blog)也有一个网站。 端口型…...

golang学习笔记——接口和继承比较1

继承 Go 语言的设计之初,就不打算支持面向对象的编程特性,因此 Go 不支持面向对象的三大特性之一——继承。但是 Go 可以通过组合的思想去实现 “继承”。继承是面向对象的三大特性之一,继承是从已有的类中派生出新的类,新的类能…...

chatGPT快捷键(最新版本)

chatGPT 快捷键,可以用于获取最新的一条回复内容 ChatGPT的API接口相当贵,有了快捷键功能,我们可以使用python的selenium控件模拟点击来实现自动化功能,通过发送快捷键来获取最新的回复内容 快捷键介绍如下: windows…...

77基于matlab的蚁群优化路径算法,二维路径和三维路径优化

基于matlab的蚁群优化路径算法,二维路径和三维路径优化。输出可视化最优路径和距离迭代曲线。数据可更换自己的,程序已调通,可直接运行。 77三维和二维路径可视化 (xiaohongshu.com)...

PyTorch中并行训练的几种方式

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...

基于非链式(数组)结点结构的二叉树的层序输入创建以及遍历

点击链接返回标题->基于非链式(数组)结点结构的二叉树的层序、先序、中序、后序输入创建以及层序、先序、中序、后序输出-CSDN博客 层序可谓是最简单的二叉树遍历了。。。。 代码很浅显易懂&#xff0c;相信你能明白的&#xff01; #include<iostream> using namesp…...

云计算:开辟数字时代的无限可能

云计算是一项革命性的技术&#xff0c;为企业和个人提供了灵活、可扩展和高效的计算资源。本文将介绍云计算的概念、架构和优势&#xff0c;并探讨其在数字化时代的重要性和未来发展趋势。 引言 随着信息技术的日新月异和数字化转型的浪潮席卷全球&#xff0c;云计算作为一种颠…...

Django+Vue项目创建 跑通

参考链接&#xff1a; 【精选】DjangoVue项目构建_django vue-CSDN博客 一、背景 主要介绍如何使用后端Django 前端Vue 的技术栈快速地搭建起一套web项目的框架。 为什么使用Django和Vue? Django是Python体系下最成熟的web框架之一&#xff0c;由于Python语言的易用…...

2023年中职“网络安全“—Linux系统渗透提权②

2023年中职"网络安全"—Linux系统渗透提权② Linux操作系统渗透测试任务环境说明&#xff1a;1. 使用渗透机对服务器信息收集&#xff0c;并将服务器中SSH服务端口号作为flag提交&#xff1b;2. 使用渗透机对服务器信息收集&#xff0c;并将服务器中主机名称作为flag…...

多模态大模型训练数据集汇总介绍

RefCOCO、RefCOCO、RefCOCOg 这三个是从MS-COCO中选取图像得到的数据集&#xff0c;数据集中对所有的 phrase 都有 bbox 的标注。 RefCOCO 共有19,994幅图像&#xff0c;包含142,209个引用表达式&#xff0c;包含50,000个对象实例。RefCOCO 共有19,992幅图像&#xff0c;包含1…...

IDEA中更换java项目JDK

我们打开IDEA 打开项目 然后选择 File 下的 Project Structure 这里 我们下拉选择自己需要的JDK Sources这里 也要设置一下JDK对应版本 然后 上面这个 Project 中 也要设置一下对应jdk的版本 保持一直 然后 我们打开 File 下的 Settings 然后 找到如下图配置 如果JKD版本看…...

从Windows到Linux:IC设计新手的双系统Ubuntu 20.04环境搭建心路历程

从Windows到Linux&#xff1a;IC设计新手的双系统Ubuntu 20.04环境搭建心路历程 第一次打开Ubuntu终端时&#xff0c;那个闪烁的光标让我想起了大学时被C语言支配的恐惧。作为在Windows环境下成长起来的IC设计工程师&#xff0c;我从未想过有一天需要面对chmod 777这样的神秘咒…...

Phi-4多模态推理模型:架构解析与应用实践

1. 项目概述Phi-4-reasoning-vision-15B是一个拥有150亿参数的多模态推理模型&#xff0c;它在视觉-语言联合理解任务上展现了惊人的性能。这个模型最吸引我的地方在于它突破了传统单模态模型的局限&#xff0c;能够同时处理图像和文本信息&#xff0c;实现更接近人类认知方式的…...

语音技能开发框架解析:从事件驱动到插件化实现

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫hermesnest/sister-skill。乍一看这个名字&#xff0c;可能会觉得有点抽象&#xff0c;甚至带点神秘色彩。但如果你对智能语音助手、家庭自动化或者个人AI助理这类话题感兴趣&#xff0c;那这个项目绝对值…...

AI主播与MCP协议集成:智能视频创作工作流实践

1. 项目概述&#xff1a;当AI主播遇见MCP最近在捣鼓AI数字人直播和智能体开发的朋友&#xff0c;估计都绕不开一个词&#xff1a;MCP。全称是 Model Context Protocol&#xff0c;你可以把它理解成一套让不同AI模型和应用之间能“说上话”的通用语言。而aituberapp/aituber-mcp…...

Llama模型转ONNX:原理、实践与性能优化全解析

1. 项目概述&#xff1a;从Llama到ONNX的模型转换之旅最近在部署大语言模型时&#xff0c;你是不是也遇到了这样的困境&#xff1a;手头有一个用PyTorch训练好的Llama模型&#xff0c;性能不错&#xff0c;但一到生产环境就头疼——推理速度慢、内存占用高、跨平台部署困难。如…...

为OpenClaw构建基于时间线的知识图谱大脑:Graphiti插件实战指南

1. 项目概述&#xff1a;为OpenClaw构建一个基于时间线的知识大脑 如果你和我一样&#xff0c;长期使用OpenClaw这类AI助手进行项目协作、知识整理和深度对话&#xff0c;你可能会遇到一个核心痛点&#xff1a;对话是线性的、易逝的。一次长达数小时的头脑风暴&#xff0c;一旦…...

机器人交互式抓取:基于强化学习的Peekaboo技能实现与调优

1. 项目概述&#xff1a;一个窥探与抓取技能的“捉迷藏”游戏最近在GitHub上看到一个挺有意思的项目&#xff0c;叫openclaw-skill-peekaboo。光看这个名字&#xff0c;就透着一股子技术宅的趣味和巧思。“OpenClaw”直译是“开放爪子”&#xff0c;很容易联想到机械臂或者抓取…...

钉钉机器人技能框架dingtalk-skills:从简单回复到智能业务代理的架构实践

1. 项目概述与核心价值最近在折腾企业内部自动化流程&#xff0c;发现钉钉这个平台虽然开放了机器人、工作流等接口&#xff0c;但真要实现一些定制化的、复杂的业务逻辑&#xff0c;尤其是需要结合内部系统数据做决策的场景&#xff0c;总感觉有点“隔靴搔痒”。官方提供的模板…...

Python调试工具copaw:轻量级、可扩展的pdb增强方案

1. 项目概述&#xff1a;一个轻量级、可扩展的Python调试工具在Python开发中&#xff0c;调试是每个开发者都绕不开的日常。无论是追踪一个难以复现的Bug&#xff0c;还是理解一个复杂库的内部数据流转&#xff0c;我们都需要依赖调试器。pdb是Python自带的调试器&#xff0c;功…...

AvaKill:为AI代理构建零信任安全防护的实战指南

1. 项目概述&#xff1a;AI代理的“安全气囊”AvaKill如果你正在开发或使用AI代理&#xff08;比如Claude Code、Cursor、Windsurf这类能直接操作文件、运行命令的智能助手&#xff09;&#xff0c;那你一定对它们偶尔的“疯狂”行为心有余悸。我见过一个真实的案例&#xff0c…...