Python 进阶(十七):日志输出(logging 模块)

在这里插入图片描述

大家好,我是水滴~~

Python日志输出是一种重要的工具,用于记录和跟踪应用程序的关键信息。本文将详细介绍Python中的日志输出,包括日志级别、日志记录器、日志处理器以及如何配置和定制日志输出。我们还将提供代码示例,帮助您快速上手并充分利用Python日志输出功能。

文章中包含大量的示例代码,希望能够帮助新手同学快速入门。

《Python入门核心技术》专栏总目录・点这里

文章目录

  • 前言
  • 一、日志级别
  • 二、日志记录器(Logger)
  • 三、日志处理器(Handler)
  • 四、日志格式化器(Formatter)
  • 五、日志过滤器(Filter)
  • 六、配置和定制日志输出
  • 总结


前言

在开发和维护应用程序时,了解应用程序的行为和状态对于故障排查、调试和性能优化至关重要。Python提供了一个强大的日志输出模块——logging库,它使我们能够将应用程序的关键信息记录到日志文件、控制台甚至是网络中。本文将详细介绍Python日志输出的概念、组件以及如何在应用程序中使用它。

下面是一个简单的例子:

import logging

logging.warning('Hello Logging!')

控制台输出结果:

WARNING:root:Hello Logging!

一、日志级别

日志级别用于区分日志消息的重要性和严重程度。Python logging库提供了几个标准的日志级别,包括DEBUG、INFO、WARNING、ERROR和CRITICAL。每个级别都有一个整数值,用于比较和设置日志记录的阈值。下面是各个级别的含义:

级别 数值 含义
logging.DEBUG 10 详细的信息,通常只有试图诊断问题的开发人员才会感兴趣。
logging.INFO 20 正常的信息性消息,用于确认应用程序的运行状态。
logging.WARNING 30 表示潜在的问题或不合理的操作,但不会导致应用程序中断。
logging.ERROR 40 表示错误事件,可能会导致应用程序中断或无法正常工作。
logging.CRITICAL 50 表示严重错误,可能会导致系统崩溃或无法继续运行

通过设置适当的日志级别,我们可以控制哪些级别的日志消息将被记录,从而过滤和管理日志输出。

二、日志记录器(Logger)

日志记录器是logging库的核心组件,它负责记录和处理日志消息。我们可以创建不同的日志记录器来区分应用程序中不同模块或组件的日志记录。每个日志记录器都有一个名称,通常使用模块名或类名来命名。日志记录器之间还存在一个层次结构,可以设置父子关系,从而管理和继承日志配置。

以下是创建日志记录器的示例代码:

import logging

# 创建一个日志记录器
logger = logging.getLogger('my_logger')

在上面的示例中,我们创建了一个名为my_logger的日志记录器。我们可以使用这个日志记录器记录相关的日志消息。

一旦有了日志记录器实例,就可以使用其各种方法在不同的级别上记录消息。一些常用的方法包括 debug()info()warning()error()critical()。这些方法接受一个消息字符串作为参数,并将日志消息输出。

下面是一个使用 Logger 类记录消息的示例:

import logging

# 创建一个日志记录器
logger = logging.getLogger('my_logger')
# 设置日志等级为 INFO
logger.setLevel(logging.INFO)

# 记录消息
logger.debug('调试消息')
logger.info('信息消息')
logger.warning('警告消息')
logger.error('错误消息')
logger.critical('严重消息')

上面示例创建了一个日志记录器,并将日志等级设为 INFO,并记录各级别的消息。

logging 的默认级别为 WARNING;记录的消息,只有级别大于等于设置的级别,才会被输出。

三、日志处理器(Handler)

日志处理器负责指定日志消息的输出位置。Python logging库提供了多个内置的日志处理器,如StreamHandler(输出到控制台)、FileHandler(输出到文件)以及SocketHandler(输出到网络套接字)。我们可以根据需求选择合适的处理器,或者创建自定义的处理器。

以下是使用FileHandler将日志消息输出到文件的示例代码:

import logging

# 创建一个日志记录器
logger = logging.getLogger('my_logger')
# 设置日志等级为 WARNING
logger.setLevel(logging.INFO)

# 创建一个文件处理器
file_handler = logging.FileHandler('app.log')

# 将文件处理器添加到日志记录器
logger.addHandler(file_handler)

# 记录消息
logger.debug('调试消息')
logger.info('信息消息')
logger.warning('警告消息')
logger.error('错误消息')
logger.critical('严重消息')

在上述示例中,我们首先创建一个名为’my_logger’的日志记录器。然后,我们创建一个FileHandler,指定日志消息的输出文件为app.log。最后,我们将文件处理器添加到日志记录器中。

app.log日志文件内容如下:

信息消息
警告消息
错误消息
严重消息

四、日志格式化器(Formatter)

日志格式化器(Formatter):日志格式器定义了日志消息的输出格式。它允许你指定日志消息中包含的信息以及它们的顺序。你可以使用内置的格式化选项,如时间戳、日志级别和消息内容,也可以自定义格式化字符串。每个日志处理器可以关联一个日志格式器,以便将日志消息按照指定的格式输出。

下面是一个示例,展示了如何创建一个日志格式器并将其与处理器关联:

import logging

# 创建一个日志记录器
logger = logging.getLogger('my_logger')
# 设置日志等级为 INFO
logger.setLevel(logging.INFO)

# 创建一个文件处理器
file_handler = logging.FileHandler('app.log')

# 创建一个格式化器并将其添加到文件处理器
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# 将文件处理器添加到日志记录器
logger.addHandler(file_handler)

# 记录消息
logger.debug('调试消息')
logger.info('信息消息')
logger.warning('警告消息')
logger.error('错误消息')
logger.critical('严重消息')

在上述示例中,我们创建了一个格式器对象formatter,并使用%(asctime)s、%(levelname)s和%(message)s等格式化选项定义了日志消息的输出格式。然后,我们创建了一个文件处理器file_handler,并将格式器关联到处理器上。

app.log日志文件内容如下:

2023-12-23 13:41:16,674 - INFO - 信息消息
2023-12-23 13:41:16,674 - WARNING - 警告消息
2023-12-23 13:41:16,675 - ERROR - 错误消息
2023-12-23 13:41:16,675 - CRITICAL - 严重消息

可以看出,日志内容打印了时间、级别和消息等信息。

下面是一些常用的格式化选项,你可以在Formatter中使用它们来输出不同的内容:

格式化选项 含义
%(asctime)s 日志记录时间的字符串表示(格式由datefmt参数指定)。
%(levelname)s 日志级别的字符串表示,如DEBUG、INFO、WARNING、ERROR或CRITICAL。
%(message)s 日志消息的内容
%(name)s 日志记录器的名称。
%(filename)s 包含当前执行代码的文件名。
%(pathname)s 包含当前执行代码的完整路径名。
%(module)s 当前执行代码所在的模块名。
%(funcName)s 当前执行代码所在的函数名。
%(lineno)d 当前执行代码所在的行号。
%(process)d 进程ID。
%(thread)d 线程ID。

五、日志过滤器(Filter)

日志过滤器用于控制是否记录特定类型的日志消息。它提供了更细粒度的控制,可以根据日志消息的属性进行过滤。你可以创建自定义的过滤器,并将其关联到日志处理器或日志记录器上,以便过滤和选择需要记录的日志消息。

下面是一个示例,展示了如何创建一个日志过滤器并将其与处理器关联:

import logging

# 创建一个自定义的日志过滤器
class CustomFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.INFO

# 创建一个文件处理器
file_handler = logging.FileHandler('app.log')

# 创建一个日志过滤器
filter = CustomFilter()
file_handler.addFilter(filter)

# 创建一个日志记录器
logger = logging.getLogger('my_logger')
logger.addHandler(file_handler)

# 记录消息
logger.debug('调试消息')
logger.info('信息消息')

在上述示例中,我们首先定义了一个自定义的日志过滤器CustomFilter,它继承自logging.Filter类,并重写了filter方法。在filter方法中,我们通过判断record.levelno是否等于logging.INFO来过滤出INFO级别的日志消息。然后,我们创建了一个文件处理器file_handler,并将过滤器filter添加到处理器上。最后,我们将处理器添加到日志记录器logger中,并使用logger.infologger.debug记录了两条不同级别的日志消息。根据过滤器的设置,只有INFO级别的日志消息会被记录到日志文件中。

六、配置和定制日志输出

配置和定制日志输出是使用Python logging库的关键部分。我们可以使用basicConfig函数设置日志输出的格式、级别和目标。

示例代码,展示了如何配置日志输出的格式和级别:

import logging

# 配置日志输出格式和级别
logging.basicConfig(
    format='%(asctime)s - %(levelname)s - %(message)s',
    level=logging.INFO
)

# 创建一个日志记录器
logger = logging.getLogger('my_logger')

# 记录日志
logger.debug('调试消息')
logger.info('信息消息')
logger.warning('警告消息')
logger.error('错误消息')
logger.critical('严重消息')

在上述示例中,我们使用basicConfig函数设置了日志输出的格式和级别。format参数定义了日志输出的格式,包括时间戳、日志级别和消息内容。level参数设置了日志级别为INFO,这意味着只有INFO级别及以上的日志消息会被记录。

执行上面代码,控制台输出内容:

2023-12-23 13:58:08,989 - INFO - 信息消息
2023-12-23 13:58:08,990 - WARNING - 警告消息
2023-12-23 13:58:08,990 - ERROR - 错误消息
2023-12-23 13:58:08,990 - CRITICAL - 严重消息

总结

Python日志输出是一种重要的工具,可帮助我们记录和跟踪应用程序的关键信息。通过设置适当的日志级别、创建日志记录器和选择合适的日志处理器,我们可以将日志消息输出到不同的目标,如控制台、文件、网络等。通过配置和定制日志输出的格式和行为,我们可以更好地管理和利用日志记录,以便进行故障排查、调试和性能优化。

在本文中,我们详细介绍了Python日志输出的概念、组件和使用方法,并提供了代码示例帮助读者快速上手。希望本文对于读者理解和应用Python日志输出功能有所帮助,使您能够更好地管理和追踪应用程序的关键信息。

你可能感兴趣的:(Python入门核心技术,python,logging,logger,日志)