Python3 logging 不同级别不同文件

日志记录是软件开发过程中非常重要的一环。通过记录系统运行过程中的事件和错误信息,我们可以更好地了解系统运行状态和排查问题。在Python中,logging模块提供了强大的日志功能,可以方便地进行日志记录和管理。

本文将介绍如何使用Python3的logging模块实现不同级别日志记录到不同文件的功能。我们将通过代码示例和流程图来详细说明。

1. logging模块简介

logging模块是Python标准库中的模块,用于记录程序运行时的日志。它提供了一系列的函数和类用于记录日志,并可以根据不同的级别过滤日志信息。logging模块支持的日志级别有以下几种:

  • DEBUG:详细的调试信息,通常用于开发和调试阶段。
  • INFO:普通的信息日志,通常用于记录程序正常运行时的关键信息。
  • WARNING:警告信息,通常用于记录一些不影响程序正常运行但需要关注的情况。
  • ERROR:错误信息,通常用于记录程序运行过程中的错误。
  • CRITICAL:严重的错误信息,通常用于记录导致程序无法继续运行的错误。

2. logging模块的基本使用

使用logging模块记录日志的基本步骤如下:

  1. 导入logging模块:
import logging
  1. 创建并配置Logger对象:
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

Logger对象是整个日志记录过程的核心,使用getLogger方法创建,并可通过setLevel方法设置记录的最低级别。

  1. 创建并配置Handler对象:
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler('log.txt')
stream_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.WARNING)

Handler对象用于指定日志记录的输出目标,可以是控制台、文件等。使用不同的Handler对象可以将日志记录到不同的目标中。通过setLevel方法设置每个Handler对象的日志级别。

  1. 创建并配置Formatter对象:
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

Formatter对象用于定义日志记录的输出格式,可以通过setFormatter方法将其应用到Handler对象上。%(asctime)s%(name)s%(levelname)s%(message)sFormatter对象支持的预定义格式。

  1. Handler对象添加到Logger对象:
logger.addHandler(stream_handler)
logger.addHandler(file_handler)

通过addHandler方法将Handler对象添加到Logger对象,从而实现日志的记录和输出。

  1. 记录日志:
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

通过Logger对象的各个级别方法记录相应级别的日志。

  1. 关闭日志记录:
logging.shutdown()

在所有日志记录完成后,可以调用shutdown方法关闭日志记录。

3. 不同级别日志记录到不同文件的实现

为了将不同级别的日志记录到不同的文件中,我们可以创建多个Handler对象,并将其添加到相应级别的Logger对象中。下面是一个示例代码:

import logging

# 创建Logger对象
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# 创建StreamHandler对象
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)

# 创建FileHandler对象
file_handler = logging.FileHandler('info.log')
file_handler.setLevel(logging.INFO)

# 创建FileHandler对象
error_file_handler = logging.FileHandler('error.log')
error_file_handler.setLevel(logging.ERROR)

# 创建Formatter对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(formatter)
file_handler