在Python编程中,日志记录(Logging)是一个非常重要的功能。它不仅可以帮助我们追踪和调试代码中的错误,还可以记录程序运行时的关键信息,以便后续分析和优化。Python标准库中的logging
模块为我们提供了强大的日志记录功能。下面,我将详细介绍logging
模块的基本用法和一些高级特性。
一、基本用法
1. 导入logging模块
首先,我们需要导入logging
模块:
import logging
2. 配置基本日志器
默认情况下,logging
模块提供了一个根日志器(root logger),但我们需要进行一些配置才能使用它。下面是一个基本的配置示例:
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[logging.StreamHandler()])
level
:指定日志的最低级别,这里我们设置为DEBUG
,表示DEBUG级别及以上的日志都会被记录。format
:指定日志输出的格式。这里我们使用了几个占位符:%(asctime)s
表示时间戳,%(name)s
表示日志器的名称,%(levelname)s
表示日志级别,%(message)s
表示日志消息。handlers
:指定日志处理器。这里我们使用了StreamHandler
,它会将日志输出到控制台。
3. 记录日志
配置好日志器后,我们就可以使用它来记录日志了:
logging.debug('这是一条DEBUG级别的日志')
logging.info('这是一条INFO级别的日志')
logging.warning('这是一条WARNING级别的日志')
logging.error('这是一条ERROR级别的日志')
logging.critical('这是一条CRITICAL级别的日志')
二、高级特性
1. 自定义日志器
除了使用根日志器外,我们还可以创建自定义的日志器:
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO) # 创建一个文件处理器,将日志写入文件
file_handler = logging.FileHandler('my_log.log')
file_handler.setLevel(logging.INFO) # 创建一个控制台处理器,将日志输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING) # 定义日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter) # 将处理器添加到日志器
logger.addHandler(file_handler)
logger.addHandler(console_handler) # 记录日志
logger.info('这是一条自定义日志器的INFO级别日志')
logger.warning('这是一条自定义日志器的WARNING级别日志')
在这个例子中,我们创建了一个名为my_logger
的自定义日志器,并将它的级别设置为INFO
。然后,我们创建了一个文件处理器和一个控制台处理器,并将它们分别添加到日志器中。这样,我们就可以通过logger
对象来记录日志了。
2. 日志级别
logging
模块定义了五个日志级别:DEBUG、INFO、WARNING、ERROR和CRITICAL。它们的级别从低到高,表示日志的严重程度。在配置日志器时,我们可以指定一个最低级别,只有级别高于或等于这个级别的日志才会被记录。
3. 日志传播
在logging
模块中,日志器之间存在父子关系。当子日志器没有自己的处理器时,它会将日志传递给父日志器进行处理。这就是所谓的日志传播。通过合理配置父子关系和处理器,我们可以实现复杂的日志记录需求。
4. 日志过滤器
除了设置日志级别外,我们还可以使用过滤器来进一步控制日志的输出。过滤器可以根据日志的级别、名称或其他属性来决定是否记录该日志。通过自定义过滤器,我们可以实现更精细的日志控制。
三、实践
1. 自定义练习的python文件取名
出现以下报错:AttributeError: partially initialized module 'logging' has no attribute 'getLogger' (most likely due to a circular import)
排查是因为文件名称写成了logging.py,将其重命名为其他名称即可,因为这会与Python标准库的logging
模块冲突。
2.执行结果
执行上面的代码,会在同目录下生成一个log目录,并且记录日志信息
四、总结
logging
模块是Python标准库中一个非常强大的日志记录工具。通过合理配置和使用它,我们可以轻松实现复杂的日志记录需求。在开发过程中,合理使用日志记录功能可以帮助我们更好地追踪和调试代码中的错误,提高开发效率。