文章插图
对程序员来说,Logging 是一种非常重要的功能 。无论调试程序还是程序运行时的信息显示,Logging 都很有用 。在本文中,我会演示为什么要使用以及如何使用 Python 中的 Logging 模块 。
为什么要使用 Logging 而不使用 print()print 语句跟 Logging 输出存在本质上的不同 。一般地,print 语句用于向 stdout(标准输出)写入有用的信息或程序需要输出的信息 。然而 Logging 将这些信息写入 stderr(标准错误输出) 。
import logginglogging.basicConfig(level=logging.INFO) #We'll talk about this soon!logging.warning('Something bad could hAppen!')logging.info('You are running the program')logging.error('Aw snap! Everything failed.')print("This is the program output")复制代码
如果我运行这段程序,可以看到命令行输出了如下信息 。$ python log_test.pyWARNING:root:Something bad could happen!INFO:root:You are running the programERROR:root:Aw snap! Everything failed.This is the program output复制代码
然而对于普通用户来说,信息太多了 。虽然这些都在命令行显示,但数据却被分开了 。所以用户应当这样运行程序 。这里多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等 。想要这些资料的可以关注小编,并私信“01”即可领取 。
$ python log_test.py > program_output.txtWARNING:root:Something bad could happen!INFO:root:You are running the programERROR:root:Aw snap! Everything failed.$ cat program_output.txtThis is the program output复制代码
在这里,需要输出的信息通过重定向符 > 写入到一个文件 。所以我们能看到终端的运行情况,也可以方便地从文件中得到输出信息 。现在我们来了解日志等级!Logging 和日志等级需要使用 Logging 的原因各有不同 。这些原因可以根据严重性的不同分为如下几类 。
- DEBUG: 开发者调试信息,包括经计算得到的值、参数估值、URL、API 调用信息等 。
- INFO: 一般性的信息 。
- WARNING: 关于输入、参数等的警告 。
- ERROR: 报告由于用户操作不当或程序运行时发生的错误 。
- CRITICAL: 最高等级的日志输出,通常用于某些关键问题(取决于具体情况) 。
配置 Logger 和日志处理程序Logger 可以配置不同的参数,可以配置特定日志等级、日志文件名、文件模式和日志打印的输出格式 。
配置 Logger 的参数Logger 可采用如下配置 。
import logginglogging.basicConfig(filename='program.log', filemode='w', level=logging.DEBUG)logging.warning('You are given a warning!')复制代码
上面的代码向 program.log 文件输出日志 。filemode='w' 用于设置文件读写模式 。filemode='w' 表示需要打开一个新文件并覆盖原来的内容 。该参数默认设置为 'a',此时会打开相应文件,并追加日志内容,因为有时需要获取历史日志 。表示等级的参数 level 用于确定日志的最低等级 。例如,当设置 level 为 INFO,程序就不会输出 DEBUG 级别的日志 。你可能知道,需要设置 'verbose=debug' 才能获取一些参数 。日志等级默认为 INFO 。创建日志处理器虽然上述方法直接明了,满足了一个简单的应用程序的需求,但对于一个软件产品或服务来说,需要全面的日志处理流程 。因为很难在数以百万计的 DEBUG 级日志中找到某个 ERROR 级日志 。此外,在整个程序和模块中,我们应当使用单一的 Logger 。这样我们就可以正确地把日志添加到同一文件中 。所以我们可以使用具有不同配置的 Handler 来处理这种任务 。
【Python Logging 使用指南】
import logginglogger = logging.getLogger("My Logger")logger.setLevel(logging.DEBUG)console_handler = logging.StreamHandler()file_handler = logging.FileHandler('file.log', mode='w')console_handler.setLevel(logging.INFO)file_handler.setLevel(logging.DEBUG)logger.addHandler(console_handler)logger.addHandler(file_handler)复制代码
可以看出,我们首先通过名称获取到一个 Logger 。以此可以在程序的其他任意地方使用同一个 Logger 。我们把全局的 Logging 等级设为最低的 DEBUG,这样我们就可以在其他日志处理器中设置任意日志等级 。
推荐阅读
- Python+PyQt架构:Model/View结构之QStringListModel编程示例
- 2020年最佳的Python代码编辑器
- 使用python做内网穿透小工具实现花生壳功能!
- python语言实现 十道经典的算法编程题目
- 使用布隆过滤器用于Python网络爬虫URL去重
- 利用python+opencv获取你的身份证信息
- 使用 Python 读取 QQ 消息
- Python大佬手把手教你用wxPython模块编写界面程序
- 深入了解python的3D高级库pyvista
- 汽车车道视频检测:python+OpenCV为主实现