python 消息框但不影响程序执行_还在用print()查找错误?日志消息不香嘛?| 原力计划...

d0ba63b728ca9190a1217279b01e80a4.png

作者 | 灰小猿

责编 | 王晓曼

出品 | CSDN博客

最近在做项目开发的时候,跟小伙伴聊到修 Bug 这件事。

嗯,对于一只没技术的程序猿来说,修 Bug 的确是一件让人头疼的事情,尤其是对于比较大型的项目开发,在变量较多的时候,一次次的检查错误是真的让头发颤抖。

在这里想问一下有多少小伙伴是在 Python 中使用 print 来输出某个变量从而检查参数错误的?

嗯…没秃头以前我也是这样做的,后来我为了以后有更多的时间去修 Bug,慢慢的发现断言是个好东西,再后来为了直接观察到整个程序某个值的变化过程,发现还是日志处理是真香。

那么今天大灰狼就来和大家聊聊 Python 日志处理的那些梗!

记日志是一件很棒的事,它可以很好的帮助我们理解程序中发生的事以及事情发生的顺序。

在 Python 中记录程序运行的日志文件时,我们需要调用 logging 模块,通过该模块,我们很容易的创建自定义的消息记录,这些日志消息将描述程序执行时,何时达到日志函数的调用,并列出我们想要指定的任何变量当时的值。

另一方面来说呢,如果我们在日志文件中发现某些日志消息缺失,这就表明有一部分代码被跳过,从未执行。这意味着什么…嗯,我想作为程序猿的你应该也很清楚。

79a38600605f09056dba9d5383b91dfa.png

使用日志模块

使用日志消息要启用 logging 模块,在程序运行时将日志信息显示在屏幕上,所以我们当然需要先调用该模块了,并且输入以下代码:

#调用logging函数

import logging

logging.basicConfig(filename='logginginfo.txt', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

这行代码的作用是定义的一个输出格式,输出某一条日志消息执行的时间。

当 Python 记录一个事件的日志时,它会创建一个 LogRecord 对象,保存关于该事件的信息,Logging 模块的函数让你能够指定看到这个 LogRecord 对象的细节,以及希望的细节展示方式。

值得注意的是,当我们想要将监控的值通过日志文件进行输出时,需要调用 logging.deBug 函数,并且该函数的输出方式与 print 相同,而这行消息输出值的格式,就是我们最开始在 logging.loasicConfig 中指定的,并且包括我们传递给 debug 的参数消息。

以一个计算阶乘的函数为例,我们监控该函数中每一个变量在程序运行时值的变化情况:

#阶乘计算日志消息输出实例

import logging

logging.basicConfig( level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

#logging.disable(logging.CRITICAL)

logging.debug("程序测试:")

def factorial(n):

logging.debug("阶乘数为:%s" %(n))

result = 1

for i in range(1, n + 1):

result *= i

logging.debug("此时乘的数为:%s, 结果是%s" %(i, result))

logging.debug('最终结果:%s' %(result))

return result

print(factorial(5))

运行结果:

dfe5a04fb4d620a603ad295364638deb.png

通过这些日志消息的输出,我们就可以看到在程序执行时该循环内部发生的值的变动的情况,从打印出的日志文件可以看出,Logging.debug 函数不仅输出了我们所监控的变量的数值,并且输出了该函数在调用时的时间和单词 Bebug。

通过这样的一个日志我们就可以非常直观的看到程序在运行过程中的变化情况。

3ae690e7b880f62dd92a27fb769c19ed.png

不要使用print调试程序

现在我们来聊一下,为什么不建议使用 print 函数进行值的监控输出,并不是说 pintf 函数不能够将我们监控的变量值输出。

而是我们在将程序调试完成的时候,需要花费很多时间从代码中清除每条日志消息中的 print 函数,这样的话,我们就很有可能一不小将我们期望输出的内容进行删除。

然而,日志消息就很好地避免了这一点,我们可以随心所欲的在程序中添加很多日志变量。

那可能就会有小伙伴问了,难道使用日志文件输出的内容在最后就不需要禁用了吗?

当然不是的,只是使用 logging.debug 输出的语句在最后不需要我们一个个的将其禁用,只需要调用 logging.disable(logging.CRITICAL) 就可以完全禁止日志输出。

不像print函数那样必须将每一行删除或注释掉,因此 logging.disable 模块让日志文件的显示和隐藏变得更加方便快捷。

哈哈,下一步你可能会认为我要说 logging.disable 函数的禁用功能了。

嗯…那接下来我们就来说一下Python中日志消息的级别,是不是很惊喜?没事,都会有的喔!

3a8ba5194062274f24d5da42eee1d410.png

日志级别

我们所调用的日志文件是有日志级别的,“日志级别”提供了一种方式。

这种方式按重要性将日志消息进行了分类,五个日志级别如下表所示,从最不重要到最重要,利用不同的日志函数消息,可以按某个级别计入日志并且输出。

e18bed58d938e9e6e210262e09d28a45.png

日志消息作为一个字符串,传递给这些函数,进行日志级别的划分只是为了方便对程序中可能出现的错误的异常判断,归根到底,具体使用哪种级别的日志消息,还是需要根据你的程序来定的。

日志级别的好处就在于,我们可以改变想要看到的日志消息的优先级,向 basicConfig 函数传入 logging DEBUG 作为 level 的关键字参数,这将显示所有日志级别的消息。

同时在进行某项程序开发的时候我们可能并不希望显示所有的日志消息,这样我们可以修改 level 的关键字参数。

例如:将 basicConfig 函数的 level 的关键字参数改为 logging.ERROR,这样将只显示 ERROR 级别和 CRITICAL 的日志消息,对于 ERROR 以下级别的日志消息并不会显示在屏幕上。

例如下面这行代码,我们只禁用 INFO 及以下级别的日志消息,则对于 INFO 以上的 WARNING 消息则不会禁用。

#日志禁用

import logging

logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

#禁用INFO及以下级别日志消息

logging.disable(logging.INFO)

logging.debug("程序测试:")

def factorial(n):

logging.debug("阶乘数为:%s" %(n))

result = 1

for i in range(1, n + 1):

result *= i

logging.debug("此时乘的数为:%s, 结果是%s" %(i, result))

logging.warning('最终结果:%s' %(result))

return result

print(factorial(5))

结果如下:

279a969446a810815e4d65443fabe7d3.png

好了,聊完日志的级别,就该禁用日志出场了!

203edd82c069d7eaf4ad64aa2e209fef.png

禁用日志

在调试完成以后,我们当然不希望所有这些日志出现在屏幕之上,这时我们需要调用 logging.disable 函数禁用这些消息,这样这些日志消息就不必进入到程序之中手动删除或者将所有日志注释掉,只需要向 logging.disable 传入一个级别,它就会禁止该级别和更低级的所有日志消息。

所以如果想要禁用所有日志,只需要向程序中添加:

logging.disable(logging.CRITICAL),

同时还有一点需要注意的是:logging.disable 函数将禁用它之后的所有该级别及以下的消息。

所以在这里我们就可以将禁用日志消息的 logging.disable 函数放在程序文件的最前方,调用 import logging 模块之下,这样就很容易找到,并且根据需要来注释掉,从而启用或禁用日志消息的作用。

9c4b09830af61f4a56b5bace252e6aa2.png

将日志记录到文件

我们除了将日志消息显示在屏幕上以外,还可以将它们写入到文本文件之中,这样做目的是为了我们在进行程序调试的时候,不至于很多日志文件显示在屏幕,从而影响我们对变量的读取的读取,在 rogging.basicConfig 函数接收filename 关键字为参数,像这样:

#将日志写入文件

logging.basicConfig(filename='logginginfo.txt', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

之后日志消息就会被保存到某一特定的文本文件中,同样使用求阶乘的函数,将日志消息存入 txt 文件中:

541888b8e4d805fe2b52d8e81d6fbd58.png

这样程序输出的结果中就只会有我们使用 print 想要输出的内容,对于日志消息,则会保存在相应的日志文件中去。

ee7f802e771a013f1d2e6b94f54b337a.png

虽然日志消息很有用,但如果不存入文件显示,就可能会和我们想要输出的结果一同显示在屏幕上,让我们很难找到程序中真正的输出。将日志信息写入到文件以后,这样就会使屏幕变得干净整洁,就能够很好的保存信息。

这样在程序运行之后,如果发现某些程序错误,我们就可以直接在该文本文件中读取日志,查看变量信息。

版权声明:本文为CSDN博主「灰小猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/weixin_44985880/article/details/106179998

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

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

相关文章

vue中传值和传引用_vue prop属性传值与传引用示例

vue prop属性传值与传引用示例vue组件在prop里根据type决定传值还是传引用。简要如下:传值:String、Number、Boolean传引用:Array、Object若想将数组或对象类型也以值形式传递怎么办呢?如下方式可以实现:// component-…

.sql文件_Mysql分组排序及Sql文件执行

最近在做一个临时项目,采用的是mysql开发,主要涉及两个问题:1.一个是传参问题;2.另一个是实现对数据分组取前4的数据。个人感觉很有意义,特此记录一下。一.传参问题执行mysql文件,需要从外部传入参数时&…

android 动态库 后缀,Android Robolectric加载运行本地So动态库

前言Robolectric 是 Android 的单元测试框架,运行无需 Android 真机环境直接运行在 JVM 之上,所以在 test case 运行速度效率上有了很大提升,接近于 Java JUnit test(JUnit test > Robolectric ≫ androidTest)。不过框架本身并不支持 so …

java web输出语句到控制台_Java工程师(6).循环结构

搞清楚循环结构语句的执行效果与使用场景。程序中的循环流程程序中的循环流程试着编写程序实现下列功能:在控制台中输出100个Hello字符串。在控制台中输出从 1 到 100 的数字。… …循环结构的三要素循环结构必然包含如下三要素:循环变量 (循…

sap生产工单报工_SAP系统PP (ProductionPlanning) 模块知识培训

SAP系统PP(ProductionPlanning)模块知识培训主要内容为支持生产系统规范使用SAP系统开展日常业务,掌握SAP系统常用操作和异常处理的方法,人力资源部在6月10日下午组织实施了一期《SAP系统PP模块知识》的培训。本次培训由信息技术部主管工程师解虎授课&am…

64位程序怎么判断指针是否有效_AArch64应用程序级编程模型

根据实现选择,体系结构支持多级执行特权,由从EL0到EL3的不同异常级别表示。EL0对应于最低的特权级别,通常被描述为无特权。应用层程序员模型是在EL0上执行软件的程序员模型。系统软件决定异常级别,因此决定软件运行的特权级别。当…

n个小球放入m个盒子中_飞么盒子卫生巾自助售卖机前景

嘿,你有没有经历过,出门在外来大姨妈却没带M巾呢?尴尬丛生的你选择怎么做?现在,有了新选择,这也是今天我们迫不及待想要和你们介绍的新朋友—飞么盒子,由Faimes飞么品牌自主研发出品的卫生巾售卖…

Android代码设置角标,Android上的Badge,快速实现给应用添加角标

应用角标是iOS的一个特点,原生Android并不支持。或许是由于当时iOS的通知栏比较鸡肋(固然如今已经改进了不少),而Android的通知栏功能强大?因此才出现了一方依赖于数字角标,一方坚持强大的通知栏,在平常使用中这两种交…

opencv模糊图像变清晰_opencv-python 4.2图像模糊

图像模糊可以去除噪音。import cv2 import numpy as npimage cv2.imread("dogcat1.jpg") cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", image)#均值模糊 dst cv2.blur(image, (5, 5)) cv2.imshow("…

datatable怎么根据两列分组_公司要IT转型,我该怎么办?用Python进行数据处理

“ 以后数据处理,都用pandas”01 面临问题作为运维人员,每周要统计很多数据,特别是周四写周报的时候,基本要花半天时间。既然已经学了Python,那就试试优化它。以统计不同厂家、不同设备类型告警量为例。需要将多份类似…

pandas尾部添加一条_Numpy与Pandas

Numpy#导入numpy包 import numpy as np ##from numpy import * #定义数组 #一维数组 anp.array([1,2,3,4]) #二维数组 bnp.array([(1,2,3),(4,5,6)]) #定义数组类型 cnp.array([(1,2),(3,4)],dtypecomplex) #array([[ 1.0.j, 2.0.j],[ 3.0.j, 4.0.j]])#数组的维数 a.shape #(…

python爬虫获取url_Python爬虫如何获取页面内所有URL链接?本文详解

如何获取一个页面内所有URL链接?在Python中可以使用urllib对网页进行爬取,然后利用Beautiful Soup对爬取的页面进行解析,提取出所有的URL。什么是Beautiful Soup? Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索…

iview table增加一行减少一行_PQ入门函数:Table.ReplaceValue

一、基础介绍Table.ReplaceValue函数的官方说明如下:Table.ReplaceValue(table as table, oldValue as any, newValue as any, replacer as function, columnsToSearch as list)该函数实现的功能是将Table中的值替换成新值,语法翻译成汉语大致如下&#…

gprs模块ftp 远程升级_基于GPRS无线通信技术的冷链监测系统

GPRS(general packet radio service)是通用分组无线业务的简称,该技术建立在GSM网络的基础上,被称为2.5 代移动通信技术,它将无线通信与Internet 紧密结合。基于GPRS的远程数据采集系统是通过中国移动的GPRS无线通信网…

小米登录协议分析_联想前副总裁常程跳槽小米数月后,波澜再起

► 文 观察者网 吕栋今年初,联想集团前副总裁常程离职2天即加盟小米,这一举动是否违反竞业协议,双方当时曾各执一词。最近,由于联想方面在北京提起劳动仲裁,此事也再度引发舆论关注。9月21日,针对“联想与…

值从哪里来_Linux used内存到底去哪里了呢?

Linux used内存到底去哪里了呢?阅读文章之前请先思考这么个问题我ps aux看到的RSS内存只有不到30M,但是free看到内存却已经使用了7,8G了,已经开始swap了,请问ps aux的实际物理内存统计是不是漏了哪些内存没算?我有什么…

html文本最小长度,CSS中处理不同长度文本的几种小技巧

CSS中处理不同长度文本的几种小技巧【推荐教程:CSS视频教程 】当我们使用 CSS 构建布局时,考虑长短文本内容很重要,如果能清楚地知道当文本长度变化时需要怎么处理,可以避免很多不必要的问题。在许多情况下,添加或删除…

matlab 判断鼠标按下_Simulink(其他校验模块)+Matlabgui(鼠标响应事件)+Stateflow汽车运动逻辑状态(二)...

1 SimulinkSimulink-其他校验模块 如下图所示为一些其他的校验模块,分别为声明模块,离散梯度模块,输入分辨率检测模块;声明模块:当输入值非零时检测通过,当输入值中包含有0时,检测模块报错。…

鸿蒙电脑操作系统最新消息,5G专家预测:7年后鸿蒙将成全球第一大操作系统

在公布两年之后,华为的鸿蒙系统历尽千难万险,蓄势待发,即将在6月2日的线上发布会上正式发布。对于鸿蒙的前景,通信行业的 5G 专家项立刚在接受采访中,在谈到对鸿蒙的看法时,他表示他相信 7 年后鸿蒙会成为全…

vivado顶层模块怎么建_【第2040期】Node 模块化之争:为什么 CommonJS 和 ES Modules 无法相互协调...

前言又到周五了。今日早读文章由Shopee周雨楠翻译授权分享。周雨楠,Shopee金融事业群前端研发,自主学习前端技术3年,喜爱各类数字媒体技术、创意设计,多次参与翻译工作。福利:有两张门票,有需要的跟情封联系…