作者 | 灰小猿

责编 | 王晓曼

出品 | CSDN博客

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

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

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

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

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

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

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

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

使用日志模块

使用日志消息要启用 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 = 1for i in range(1, n + 1):result *= ilogging.debug("此时乘的数为:%s, 结果是%s" %(i, result))logging.debug('最终结果:%s' %(result))return resultprint(factorial(5))

运行结果:

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

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

不要使用print()调试程序

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

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

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

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

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

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

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

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

日志级别

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

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

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

日志级别的好处就在于,我们可以改变想要看到的日志消息的优先级,向 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 = 1for i in range(1, n + 1):result *= ilogging.debug("此时乘的数为:%s, 结果是%s" %(i, result))logging.warning('最终结果:%s' %(result))return resultprint(factorial(5))

结果如下:

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

禁用日志

 

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

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

logging.disable(logging.CRITICAL),

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

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

将日志记录到文件

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

#将日志写入文件
logging.basicConfig(filename='logginginfo.txt', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

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

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

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

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

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

原文链接:

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

【End】

CSDN 618程序员购物日:显示器、键盘、蓝牙耳机、扫地机器人、任天堂游戏机、AirPods Pro等超多IT人的心仪好物,全场超低价出售,让1亿程序员买到爽!

更多精彩推荐

☞“原本我不会在拼多多购物,但它补贴实在太多了”
☞算法鼻祖高德纳,82 岁仍在写《计算机程序设计的艺术》
☞程序员晒端午福利,网友:看了你的福利我想摔手机
☞如何成为一名黑客?
☞发送0.55 ETH花费近260万美元!这笔神秘交易引发大猜想
☞京东姚霆:推理能力,正是多模态技术未来亟需突破的瓶颈!
你点的每个“在看”,我都认真当成了喜欢

还在用print()查找错误?日志消息不香嘛? | 原力计划相关推荐

  1. Python2 倒计时,还不快来掌握 Python3 酷炫的新特性? | 原力计划

    作者 | 云爬虫技术研究笔记 责编 | 郭芮 出品 | CSDN 博客 Python3.8已经发布近一个月了,距离Python3.0第一个版本发布也将超过10年了.相信很多人还是依旧在使用Python ...

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

    作者 | 灰小猿 责编 | 王晓曼 出品 | CSDN博客 最近在做项目开发的时候,跟小伙伴聊到修 Bug 这件事. 嗯,对于一只没技术的程序猿来说,修 Bug 的确是一件让人头疼的事情,尤其是对于比 ...

  3. 还在用print()查找错误?日志消息这顿排骨它不香嘛?

    使用日志消息进行变量监控和程序错误,可以非常清晰的区分日志消息和输出信息,是进行程序开发时较常用的错误排查方法. 目录 1 使用日志模块 2 不要使用print()调试程序 3 日志级别 4 禁用日志 ...

  4. 我们已经不用AOP做操作日志了! | 原力计划

    来源 | JAVA葵花宝典 责编 | 王晓曼.Carol  头图 | CSDN下载自东方IC 前言 用户在操作我们系统的过程中,针对一些重要的业务数据进行增删改查的时候,我们希望记录一下用户的操作行为 ...

  5. oracle 查找错误日志位置

    show parameter background_dump_dest; 一般的位置会在/data/u01/app/oracle/diag/rdbms/orcl/orcl/trace

  6. 字节跳动武汉招聘 2000 人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划...

    [CSDN编者按]金三银四的招聘季,并不会因为疫情而影响太多.据字节调动官宣,该司决定扩大今年在武汉的招聘规模,提供近2000个工作岗位,促进当地人才就业.网上也出现远程入职的字节跳动员工,还没去公司 ...

  7. 还在苦恼机器学习和线性回归?这篇总结拿走不谢 | 原力计划

    作者 | 听星的朗瑞 责编 | 王晓曼 出品 | CSDN博客 题图 | 东方IC 什么是机器学习? 机器学习是一种实现人工智能的方法,从数据中寻找规律.建立关系,根据建立的关系去解决问题,从数据中进 ...

  8. 5 月编程语言排行榜:C 重回第一,今年编程语言名人堂冠军还会是它吗? | 原力计划...

    作者 | 院主 责编 | 王晓曼 出品 | CSDN博客 本文章中语言排名数据来自TIOBE排行榜和PYPL排行榜. TIOBE排行榜5月份数据 2020年5月TIOBE指数 以下是官方说明: 五月标 ...

  9. 技术分享 | OceanBase 错误日志分析

    作者:操盛春 技术专家,任职于爱可生,专注研究 MySQL.Ocean Base 源码. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. Ocean ...

最新文章

  1. 怎样自动提取邮件的内容_流程自动化和人工智能如何创建智慧物流?
  2. C语言编程序输出SCHAR_MAX的,运用堆栈把十进制变换成二进制
  3. Confluence 6 管理协同编辑 - 关于 Synchrony
  4. 编程使用资源文件实现多语言页面(In Action)
  5. 设计实用素材|促销海报设计技巧
  6. 雷军自述:我惨痛的大学创业失败经历
  7. LayaAir Sprite 旋转缩放
  8. Golang 实现文件内容差异比较
  9. 计算机测试代码怎么写,常见的电脑检测卡代码对照表大全
  10. IOS-App Store 提审应用步骤
  11. 瑞幸的“快”与连咖啡的“慢”
  12. 论计算机的维护维修论文,论计算机的故障的处理论文范文
  13. Typora无法在applist里找到
  14. 新款苹果手机_入手新款苹果手机半个月 他们这样评价新手机
  15. python如何生成等差数列_python numpy函数中的linspace创建等差数列详解
  16. DiskGenius稳定不闪退版
  17. SpringBoot 之 Tomcat 与 Undertow 容器性能对比
  18. 配置nginx方向代理,实现URL隐形转发 (附带nginx配置文件详解)
  19. MMS制造报文系统和GOOSE报文
  20. 001_雅思写作之wonder women单词总结

热门文章

  1. 属性绑定与双向数据绑定
  2. go初探 - 生成随机整数
  3. java事件处理机制(自定义事件)
  4. 聚合数据接口,提供开放API
  5. strong和weak 细节
  6. DQN 中的梯度 clip
  7. 多元线性回归数据集_TensorFlow学习Program1——13.实现一元、多元线性回归(基于房价数据集)...
  8. Golang闭包的典型应用
  9. 中国喷漆室保护膜市场趋势报告、技术动态创新及市场预测
  10. linux系统mysql创建表,Linux系统下手动新建数据库