Python 全局日志记录器

本篇文章介绍了日志记录、它的各种级别以及它在 Python 中的重要性。 然后,我们将学习如何在全局范围内使用 Python 日志记录模块。


日志记录简介及其在 Python 中的重要性

日志记录是一种跟踪运行软件时发生的事件的方法。 软件开发人员添加日志记录调用以记录某人执行程序时发生的错误和事件。

在 Python 编程中,我们有一个称为日志记录的内置模块,可以记录此类错误和事件。 请注意,事件是消息,可以选择保存特定于事件的数据。

这些事件可以具有不同的级别/严重性,由软件开发人员指定。 因此,我们可以说日志记录是一个非常强大的工具,可以调试我们的应用程序并跟踪任何需要的信息。

日志记录模块为我们的应用程序提供了不同的方法来配置各种日志处理程序,将日志消息路由到这些处理程序,并启用高度灵活的配置,这有助于处理各种用例。

logging模块也有不同的日志级别,帮助我们应对各种严重级别。 以下是日志记录级别的简要说明:

  • INFO - 它确认各种事情都按预期工作。
  • DEBUG - 当有人诊断问题时,它提供典型的详细信息。
  • WARNING - 它表示意外发生的事情。 我们也可以说 WARNING 表示可能很快会发生的问题,例如磁盘空间不足。
  • CRITICAL - 它表示应用程序本身无法继续执行的严重错误。
  • ERROR - 它代表一个更严重的问题,不允许程序执行操作或功能。

在 Python 中全局使用日志记录模块

我们可以在 Python 中本地和全局使用日志记录模块。 这里,locally是指在特定范围内使用logging模块; 例如,我们在A.py文件中引入了logging模块,所以我们只能在A.py中使用它,而不能在B.py文件中使用。

另一方面,全局意味着在 A.py 文件和 B.py 文件中到处使用。 了解本地日志记录模块的使用对于学习 Python 全局记录器很重要。

示例代码在本地使用日志记录模块(保存在 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')

在这里,我们在导入的 test.py 文件中本地使用日志记录模块。

然后,我们使用 getLogger() 开始使用 Python 中的日志记录模块进行日志记录。 为此执行工厂函数 logging.getLogger(name)

getLogger() 接受一个参数,即记录器的名称,并返回对记录器实例(记录器的对象)的引用,如果指定则使用名称,否则返回根。

请注意,多次调用具有确切名称的 getLogger() 会返回对同一记录器实例的引用,这对于全局使用它很有用(我们稍后会看到)。

接下来,我们使用 setLevel() 方法设置日志记录的级别,并编写 sum_numbers() 函数,它接受两个 int 类型的数字,将它们相加,如果给定的值正确,则返回结果; 否则,它会生成 TypeError。

最后,我们调用 sum_numbers() 通过生成以下结果来查看我们的日志记录模块的运行情况。

输出:

Oh! TypeError Occurred
Traceback (most recent call last):
  File "E:\Code\use_logging_locally\test.py", line 8, in sum
    output = number1 + number2
TypeError: unsupported operand type(s) for +: 'int' and 'str'

使用日志模块非常简单,但是如何在全局范围内利用这个模块呢? 让我们在下面学习。

示例代码(保存在 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

输出:

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 中的日志记录模块进行日志记录。 getLogger() 接受一个参数,即记录器的名称。

通过使用 getLogger() 函数,我们可以获取对具有给定名称(如果提供)或根目录(如果未指定)的记录器实例的引用。

多次调用具有确切名称的 getLogger() 会返回对确切记录器对象的引用,这有助于我们在全局范围内使用它。

猜你喜欢

转载自blog.csdn.net/fengqianlang/article/details/131584747