Python全局记录器
本教程介绍了日志,它的各种级别,以及它在Python中的重要性。然后,我们将学习如何在全球范围内使用Pythonlogging
模块。
日志的介绍和它在Python中的重要性
日志是一种跟踪运行软件时发生的事件的方式。软件开发者添加日志调用来记录有人执行程序时发生的错误和事件。
在Python编程中,我们有一个内置模块,称为logging
,可以记录这样的错误和事件。请注意,事件是消息,并可以选择持有特定于某个事件的数据。
这些事件可以有不同的级别/严重程度,由软件开发者指定。因此,我们可以说,日志是一个非常强大的工具,可以调试我们的应用程序并跟踪任何需要的信息。
logging
模块为我们的应用程序提供了不同的方法来配置各种日志处理程序,将日志信息发送到这些处理程序,并实现高度灵活的配置,这有助于处理各种使用情况。
logging
模块也有不同的日志级别,这有助于我们处理各种严重程度。以下是对日志级别的简要描述:
-
INFO
– 它证实了各种事情都在按预期进行。 -
DEBUG
– 当有人诊断问题时,它提供了详细的典型信息。 -
WARNING
– 它是某种意外发生的指示。我们也可以说,WARNING
,表明一个可能很快发生的问题,例如,磁盘空间不足。 -
CRITICAL
– 它表示一个严重的错误,应用程序本身不能继续执行。 -
ERROR
– 它代表一个更严重的问题,不允许程序执行某个操作或功能。
在Python中全局地使用logging
模块
我们可以在Python中本地和全局使用logging
模块。这里,局部意味着在特定的范围内使用logging
模块;例如,我们在A.py
文件中导入了logging
模块,所以我们只能在A.py
中使用,而不是在B.py
文件中。
另一方面,全局意味着在A.py
文件和B.py
文件中到处使用。了解logging
模块在本地的使用对学习Python全局记录器很重要。
在本地使用logging
模块的示例代码(保存在test.py
文件中):
import logging
logger = logging.getLogger("test_logger")
logger.setLevel(logging.INFO)
def sum_numbers(number1, number2):
try:
output = number1 + number2
except TypeError:
logger.exception("Oh! TypeError Occurred")
else:
return output
result = sum_numbers(10, 'Mehvish')
这里,我们在本地使用logging
模块,在test.py
文件中,我们已经导入了这个模块。
然后,我们使用getLogger()
,开始使用Python中的logging
模块进行日志记录。为此执行工厂函数logging.getLogger(name)
。
getLogger()
需要一个参数,即记录仪的名称,如果指定了,则返回对具有该名称的记录仪实例(记录仪的对象)的引用,如果没有,则返回root
。
请注意,多次调用具有准确名称的getLogger()
,会返回对同一个记录仪实例的引用,这对于全局使用它是非常有用的(我们将在一段时间内看到)。
接下来,我们使用setLevel()
方法来设置日志记录的级别,并编写sum_numbers()
函数,该函数接收两个int
类型的数字,将其相加,如果给定的值正确,则返回结果;否则,它生成TypeError
。
最后,我们调用sum_numbers()
,看看我们的logging
模块的运行情况,产生以下结果。
OUTPUT:
Oh! TypeError Occurred
Traceback (most recent call last):
File "E:Codeuse_logging_locallytest.py", line 8, in sum
output = number1 + number2
TypeError: unsupported operand type(s) for +: 'int' and 'str'
使用logging
模块是非常容易的,但如何在全局上获得这个模块的优势呢?让我们在下面学习一下。
示例代码(保存在log.py
文件中):
import logging
def set_custom_logger(name):
formatter = logging.Formatter(
fmt='%(asctime)s - %(levelname)s - %(module)s - %(message)s'
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
return logger
示例代码(保存在submodule.py
文件中):
import logging
logger = logging.getLogger('root')
logger.debug('submodule message')
示例代码(保存在main.py
文件中):
import log
logger = log.setup_custom_logger('root')
logger.debug('main message')
import submodule
OUTPUT:
2022-10-27 09:31:02,447 - DEBUG - main - main message
2022-10-27 09:31:02,450 - DEBUG - submodule - submodule message
这个代码示例打印了日期、时间、日志级别、模块名称和消息。注意,我们在submodule.py
中使用了logging.getLogger()
,以使用我们在log.py
文件中使用的确切的记录器实例。
如何做到的?通常运行logging.getLogger(name)
,开始使用Python中的logging
模块进行日志记录。getLogger()
接受一个参数,即记录器的名称。
通过使用getLogger()
函数,我们可以得到一个对具有给定名称的记录器实例的引用(如果提供了的话),或者root
,如果没有指定它。
多次调用具有确切名称的getLogger()
,可以返回对确切的记录仪对象的引用,这有助于我们在全局范围内使用它。