Python中使用logging模块代替print(logging简明指南)
使用print输出调试信息是一种常见的方式,但是print的缺陷也很明显:有时候输出的信息太多太杂,有时候输出的信息太少无法发现问题。为了更好的管理和处理调试信息,Python提供了logging模块。
基本用法
使用logging的流程可以大致分为以下三个步骤:
- 导入logging模块
- 配置logging参数
- 使用logging输出信息
以下是一个基本的代码示例,演示了如何使用logging输出一条信息:
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
handlers=[logging.StreamHandler()])
logging.info('Hello, logging!')
代码说明:
- 导入logging模块
- 调用basicConfig函数配置logging参数。这里我们设置了日志级别为INFO,格式为'[时间] [级别] 消息',使用了StreamHandler输出到控制台。
- 调用info函数输出一条信息。
上述代码执行后,会在控制台输出一条消息:
2022-01-01 00:00:00,000 [INFO] Hello, logging!
日志级别
logging提供了多种日志级别,用于过滤日志信息。从低到高分别是:DEBUG、INFO、WARNING、ERROR、CRITICAL。默认情况下,logging的日志级别是WARNING,即只输出WARNING及以上级别的日志信息。
示例:
import logging
# 基本配置
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s [%(levelname)s] %(message)s',
handlers=[logging.StreamHandler()])
# 输出不同级别的日志
logging.debug('This is a debug message') # 不会输出
logging.info('This is an info message') # 输出
logging.warning('This is a warning message') # 输出
logging.error('This is an error message') # 输出
logging.critical('This is a critical message') # 输出
日志格式
通过设置format参数,可以自定义日志的格式。format参数是一个字符串,其中包含各种占位符,日志输出时会替换成相应的信息。
以下是一些常用的占位符:
- %(asctime)s:日志发生时间
- %(levelname)s:日志级别
- %(message)s:输出内容
- %(name)s:Logger的名称
- %(module)s:发出日志调用的模块
- %(lineno)d:发出日志调用的代码行号
示例:
import logging
# 基本配置
logging.basicConfig(level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
handlers=[logging.StreamHandler()])
# 输出不同格式的日志
logging.info('This is a message with %(name)s') # This is a message with root
logging.info('This is a message with %(module)s:%(lineno)d') # This is a message with __main__:3
输出到文件
logging还可以将日志信息输出到文件中,通过FileHandler实现。以下是一个简单的代码示例:
import logging
# 基本配置
logging.basicConfig(level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
handlers=[logging.FileHandler('log.txt')])
# 输出日志到文件
logging.info('Hello, logging!')
执行上述代码后,会在当前目录下生成一个log.txt文件,其中包含一条日志信息。
日志轮换
当日志文件变得比较大时,我们可能需要定期轮换日志。logging提供了RotatingFileHandler和TimedRotatingFileHandler两种实现方式。
- RotatingFileHandler:按文件大小轮换日志文件。示例中的代码轮换的是文件大小,当达到5MB时,自动备份当前日志文件,重新生成一个新的文件。
- TimedRotatingFileHandler:按时间轮换日志文件。示例中的代码以天为单位轮换,每天自动生成一个日志文件,最多保留10个文件。
示例:
import logging.handlers
# 日志轮换配置(按文件大小轮换)
log_handler = logging.handlers.RotatingFileHandler('example.log', maxBytes=5*1024*1024, backupCount=5)
log_handler.setLevel(logging.INFO)
log_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(message)s'))
# 日志处理器加入Root Logger
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)
root_logger.addHandler(log_handler)
# 输出日志
for i in range(10000):
logging.info('This is a rotating log message.')
上述代码实现了按文件大小轮换日志文件。log_handler是用于轮换日志的处理器,maxBytes参数指定每个日志文件的最大大小,backupCount参数指定备份数量,即保留几个旧文件。其他部分和基本用法相同。
TimedRotatingFileHandler的使用方式和上述示例类似,这里不再赘述。
总结
使用logging可以更好的管理和处理调试信息,降低代码质量的成本。logging提供了多种定制化功能,可以满足不同的需求。建议在编写Python程序时,合理地使用logging模块,提高代码的可读性和可维护性。
以上是Python中使用logging模块代替print的详细攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中使用logging模块代替print(logging简明指南) - Python技术站