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() ,可以返回对确切的记录仪对象的引用,这有助于我们在全局范围内使用它。