Python3 logging 不同级别不同文件
日志记录是软件开发过程中非常重要的一环。通过记录系统运行过程中的事件和错误信息,我们可以更好地了解系统运行状态和排查问题。在Python中,logging
模块提供了强大的日志功能,可以方便地进行日志记录和管理。
本文将介绍如何使用Python3的logging
模块实现不同级别日志记录到不同文件的功能。我们将通过代码示例和流程图来详细说明。
1. logging
模块简介
logging
模块是Python标准库中的模块,用于记录程序运行时的日志。它提供了一系列的函数和类用于记录日志,并可以根据不同的级别过滤日志信息。logging
模块支持的日志级别有以下几种:
DEBUG
:详细的调试信息,通常用于开发和调试阶段。INFO
:普通的信息日志,通常用于记录程序正常运行时的关键信息。WARNING
:警告信息,通常用于记录一些不影响程序正常运行但需要关注的情况。ERROR
:错误信息,通常用于记录程序运行过程中的错误。CRITICAL
:严重的错误信息,通常用于记录导致程序无法继续运行的错误。
2. logging
模块的基本使用
使用logging
模块记录日志的基本步骤如下:
- 导入
logging
模块:
import logging
- 创建并配置
Logger
对象:
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
Logger
对象是整个日志记录过程的核心,使用getLogger
方法创建,并可通过setLevel
方法设置记录的最低级别。
- 创建并配置
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
对象的日志级别。
- 创建并配置
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)s
是Formatter
对象支持的预定义格式。
- 将
Handler
对象添加到Logger
对象:
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
通过addHandler
方法将Handler
对象添加到Logger
对象,从而实现日志的记录和输出。
- 记录日志:
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
对象的各个级别方法记录相应级别的日志。
- 关闭日志记录:
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