在 Python 中使用 setLevel() 设置日志级别
日志记录是任何程序员生活中非常有效的工具。 它不仅可以让我们更好地理解程序的流程,还可以让我们了解程序执行过程中可能出现的错误。
Python 提供了一个单独的日志记录模块作为其标准库的一部分,以简化日志记录。 本文将讨论日志记录 setLevel 及其在 Python 中的工作方式。
Python登录程序的功能
日志记录是在软件运行时跟踪程序流程的过程。 但是,如果您没有实现登录到您的程序中,那么每当程序崩溃时,就很难找到发生问题的根源。
通过在程序中实现日志记录,您可以轻松找到问题的根源并立即解决。 它在调试和开发软件时非常有用。
有时,人们使用打印语句来查找软件中的问题。 打印可以解决简单脚本的问题,但对于更大、更复杂的软件来说,它们不是一个好的选择。
Python 在其标准库中提供了一个称为日志记录的内置模块,该模块将状态消息写入任何输出流或文件,以说明程序的哪一部分正在运行以及导致了什么问题。
Python 中的日志消息级别
Python 中的日志记录模块根据其重要性具有不同的状态/日志消息级别。 因此,日志消息的级别告诉您该日志消息的重要性。
日志消息的不同级别如下:DEBUG、INFO、WARNING、ERROR 和 CRITICAL,其中 CRITICAL 的重要性最高。
日志级别 | 说明 |
---|---|
DEBUG | 它用于在软件中进行调试。 通常会在出现问题时提供详细信息。 |
INFO | 它确保程序中的一切正常。 |
WARNING | 用来表示将来可能会出现一些问题,应该予以解决以避免将来出现问题。 |
ERROR | 用于表示软件由于严重问题而无法执行特定功能。 |
CRITICAL | 此级别表示导致软件停止的严重问题。 |
所有这些级别都是为处理程序或记录器设置的,以便在发生错误时可以在适当的时间显示适当的消息。 日志记录级别在上面根据它们的重要性进行了解释,第一个是最不重要的,最后一个(CRITICAL 级别)是最重要的。
使用 Python 日志记录模块中的 setLevel() 函数设置日志记录级别
setLevel(level)
函数用于将记录器的阈值设置为指定级别。 低于指定级别的日志记录消息将被忽略,而具有更高严重性的消息将由为记录器提供服务的相应处理程序发出。
Python 中的日志记录有一个有效级别的概念。 最初,当创建记录器时,它被设置为 NOTSET 级别。
但是,此 NOTSET 不是有效级别。 有效级别是在 setLevel(level)
的帮助下明确设置的级别。
创建记录器时,如果未显式设置其级别,则检查其父记录器的级别以获得记录器的有效级别,该级别将使用 setLevel(level)
显式设置。 如果父记录器也未设置为有效级别,则检查其父记录器。
该过程将继续,直到找到 NOTSET 以外的级别或到达根。 根记录器设置为默认级别警告; 因此,在这种情况下,root 的默认级别将被视为有效级别。
现在,让我们通过一些代码示例了解 setLevel(level)
的用法。
import logging
logging.debug('Debug message')
logging.info('Info message')
logging.warning('Warning message')
logging.error('Error message')
logging.critical('Critical message')
输出:
WARNING:root:Warning message
ERROR:root:Error message
CRITICAL:root:Critical message
如上面的输出所示,只打印了 WARNING、ERROR 和 CRITICAL 消息,因为根记录器的默认级别 WARNING 已被视为有效级别,因为没有指定其他记录器或其父级。 因此,将打印 WARNING 及之后级别的所有消息,而忽略不那么重要的消息。
让我们看一个例子,记录器将有效级别视为父级别。
import logging
parent_logger = logging.getLogger('parent')
parent_logger.setLevel(4)
child_logger = logging.getLogger('parent.child')
print(parent_logger.getEffectiveLevel())
print(child_logger.getEffectiveLevel())
输出:
4
4
可以看到,child_logger没有设置有效级别,所以使用parent_logger的级别作为有效级别。
Python 中的日志处理程序
Python 中的处理程序是负责将适当的日志消息记录到处理程序的指定目的地的对象; 这些处理程序也像记录器一样工作。 如果记录器没有设置处理程序,则会在其祖先中搜索处理程序。
现在让我们看看处理程序在日志记录中的用法:
import logging
logger = logging.getLogger('example')
logger.setLevel(logging.INFO)
fileHandler = logging.FileHandler('p1.log')
fileHandler.setLevel(logging.INFO)
chl = logging.StreamHandler()
chl.setLevel(logging.INFO)
logger.addHandler(fileHandler)
logger.addHandler(chl)
logger.info('Information')
输出:
Information
我们在上面的代码中创建了两个处理程序:fileHandler 和 chl。 fileHandler 将记录发送到 p1.log 文件,chl 处理程序将记录发送到流。
但是,如果未指定流,则使用 sys.stderr。 最后,使用 addHandler 将处理程序添加到记录器。
现在您一定想知道为什么我们设置了两次级别:一次用于记录器,另一次用于处理程序。 您可以删除处理程序上的 setLevel(),这会将消息的所有级别过滤留给记录器。
但是,如果您为处理程序和记录器设置级别,则会出现不同的情况。 记录器首先根据级别过滤消息; 因此,如果您将记录器设置为 WARNING、INFO 或任何更高级别,并将处理程序设置为 DEBUG,您将不会收到任何 DEBUG 日志消息,因为记录器首先会忽略它。
同样,如果您将记录器设置为 DEBUG 并将处理程序设置为任何更高级别,例如 INFO,您也不会收到任何 DEBUG 消息,因为处理程序将拒绝它们。 即使记录器批准它,处理程序也会拒绝它(因为 INFO > DEBUG)。
因此,在为记录器和处理程序设置级别时应该足够小心,以确保软件正常工作。
总结
在本文中,我们讨论了日志记录 setLevel()
及其在 Python 中的工作方式。
日志记录是一种非常有效的工具,通过记录程序的流程并发现错误的可能性来管理软件或程序的代码。 对于 Python 中的日志记录,我们根据它们的重要性为不同的日志消息设置不同的级别。
所有这些级别都是使用 setLevel 设置的,本文对此进行了非常详细的解释。
相关文章
Python 日志记录传播
发布时间:2023/06/14 浏览次数:174 分类:Python
-
本文介绍了 LevelFilter 的使用,以显示如何将特定级别及更高级别(例如,INFO 及更高级别)的特定记录器名称的消息记录到特定的日志处理程序。Python 日志记录传播
Python 全局日志记录器
发布时间:2023/06/14 浏览次数:146 分类:Python
-
本文介绍 Python 中的日志记录模块。 它还介绍了日志记录级别及其重要性,从而生成了一个代码示例,演示了 Python 日志记录模块的全局使用。
在 Python 中可视化树
发布时间:2023/06/14 浏览次数:150 分类:Python
-
由于许多不同的原因,决策树是一种常见的监督学习技术。 决策树的优点包括我们可以将它们用于分类和回归,它们不需要特征缩放,而且决策树易于阅读。本文介绍了 Python 的 Graphviz 来显示
在 Python 中打印二叉树
发布时间:2023/06/14 浏览次数:101 分类:Python
-
本文将讨论二叉树以及我们如何使用它。 我们还将看到如何使用 Python 打印它。我们将了解在处理二叉树时使用的术语。 我们还将研究使用 Python 代码的二叉树示例。
Python 中的二维插值
发布时间:2023/06/14 浏览次数:149 分类:Python
-
本文展示了如何在 Python 中进行插值,并研究了不同的 2d 实现方法。 我们将讨论用于双变量插值的有用函数,例如 scipy.interpolate.interp2d、numpy.meshgrid 和 Python 中使用的用于平滑/插值 (RBF) 的径向
Python 中的 3D 插值
发布时间:2023/06/13 浏览次数:121 分类:Python
-
插值是在离散集的定义范围内构造新数据点的方法。 插值意味着找到点或曲线之间的值。从数学的角度来看,插值是获取位于其他已知数据点之间的特定未知数据点的值。插值的重要性
在 Python 中重新抛出异常
发布时间:2023/06/13 浏览次数:53 分类:Python
-
Python 为我们提供了 try-except 块来处理程序中的异常。 它还为我们提供了 raise 语句来手动抛出异常。本文将讨论如何在 Python 程序中重新抛出异常。在 Python 中抛出异常
Python 模拟引发异常
发布时间:2023/06/13 浏览次数:160 分类:Python
-
本文的主要目的是演示如何在使用单元测试库 unittest 时抛出异常。在 Python 中使用单元测试库 unittest 时抛出异常
Python打开文件异常处理
发布时间:2023/06/13 浏览次数:146 分类:Python
-
要打开文件,Python 有一个名为 open() 的内置函数,用户可以通过它读取或写入文件,但是如果在任何情况下文件丢失或编译器无法访问,那么,我们 遇到 FileNotFoundError。 本文将介绍如何处理