Python logging 日志模块入门指南:从基础配置到多处理器实战

发布时间:2026/7/31 3:34:20

Python logging 日志模块入门指南:从基础配置到多处理器实战 一、为什么需要日志在开发 Python 应用时我们经常需要追踪程序的运行状态、调试错误、记录关键操作信息。虽然print()能应付简单的调试场景但在正式项目中日志系统才是更专业的选择。Python 内置的logging模块提供了灵活、可配置的日志记录功能支持多个输出目标、自定义格式和分级管理是每个 Python 开发者的必备技能。二、核心概念速览1. 日志级别Level日志级别决定了信息的重要程度。logging 模块定义了以下标准级别数值越大优先级越高DEBUG10调试信息用于开发阶段排查问题。INFO20普通信息记录程序正常运行的关键步骤。WARNING / WARN30警告信息表示可能出现问题但程序仍可继续运行。ERROR40错误信息表示发生了影响功能的错误。CRITICAL / FATAL50严重错误表示程序可能无法继续运行。通过设置日志级别你可以灵活控制输出哪些信息比如开发时设为 DEBUG 查看所有细节部署到生产环境时升到 WARNING 只关注警告和错误。2. 日志格式Format日志格式决定了每条日志的输出内容。常用的格式化字段包括格式字段含义%(asctime)s日志时间戳格式可自定义%(name)s日志实例名默认为 root%(levelname)s日志级别英文名如 DEBUG、INFO%(levelno)s日志级别数值10、20、30 等%(message)s日志内容%(lineno)d输出日志的代码行号%(module)s调用日志的模块名%(filename)s文件名不含路径%(pathname)s文件完整路径3. 处理器Handlers处理器决定日志的输出目的地。最常用的两种是StreamHandler流式处理器输出到控制台sys.stdout或sys.stderr。FileHandler文件处理器将日志写入指定文件。通过组合多个处理器你可以实现“控制台实时查看 文件持久化存储”的日志方案并且每个处理器都可以独立设置日志级别和格式。三、基础用法快速上手使用logging.basicConfig()可以快速配置全局日志系统。以下示例同时启用了控制台和文件输出import logging import sys logging.basicConfig( levellogging.DEBUG, format%(lineno)d --%(module)s--%(filename)s--%(name)s--%(levelname)s --%(message)s, handlers[ logging.StreamHandler(sys.stdout), # 输出到控制台 logging.FileHandler(log) # 输出到文件 ] ) logging.debug(debug666) logging.info(info666) logging.warning(warning666) logging.error(error666) logging.critical(critical666)这种方式适合小型脚本或测试场景但无法对不同处理器单独设置级别和格式。更灵活的方案是单独配置每个处理器。四、进阶用法多实例与独立处理器在实际项目中我们通常需要为不同模块创建独立的日志实例并为每个实例配置各自的处理器和格式。下面是一个完整示例import logging ----- 创建第一个日志实例 ----- logger logging.getLogger(name) logger.setLevel(logging.DEBUG) # 实例级别设为 DEBUG允许所有级别通过 控制台处理器只输出 INFO 及以上级别 stream_handler logging.StreamHandler() stream_handler.setLevel(logging.INFO) stream_formatter logging.Formatter( %(asctime)s - %(name)s - %(levelname)s - %(message)s ) stream_handler.setFormatter(stream_formatter) logger.addHandler(stream_handler) 文件处理器只输出 WARNING 及以上级别 file_handler logging.FileHandler(log.txt) file_handler.setLevel(logging.WARNING) file_formatter logging.Formatter( %(asctime)s - %(name)s - %(levelname)s - %(message)s ) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) 测试输出 logger.debug(debug) logger.info(info) logger.warning(warn) logger.error(error) logger.critical(fatal) ----- 创建第二个日志实例独立配置----- logger2 logging.getLogger(用户模块) logger2.setLevel(logging.DEBUG) file_handler2 logging.FileHandler(log2.txt, encodingutf-8) file_handler2.setLevel(logging.WARNING) file_formatter2 logging.Formatter( %(asctime)s - %(levelname)s - %(name)s - %(message)s ) file_handler2.setFormatter(file_formatter2) logger2.addHandler(file_handler2) logger2.debug(debug) logger2.info(info) logger2.warning(warn) logger2.error(error) logger2.critical(fatal)代码解析实例创建getLogger(__name__)以当前模块名创建日志实例getLogger(用户模块)创建自定义名称的实例便于按模块区分日志来源。级别的两层过滤日志实例和处理器各自有级别设置。只有当日志消息的级别同时满足“大于等于实例级别”和“大于等于处理器级别”时才会被输出。独立配置每个日志实例拥有独立的处理器集合互不干扰。第一个实例的 DEBUG 日志不会出现在控制台被流处理器过滤第二个实例的日志也不会写入log.txt。五、运行结果解读运行上述代码后控制台将看到2026-07-30 12:00:00,123 - __main__ - INFO - info 2026-07-30 12:00:00,124 - __main__ - WARNING - warn 2026-07-30 12:00:00,124 - __main__ - ERROR - error 2026-07-30 12:00:00,125 - __main__ - CRITICAL - fatal注意debug消息没有出现在控制台因为流处理器的级别设为了 INFO。文件log.txt中只有 WARNING 及更高级别的日志warn、error、fatalDEBUG 和 INFO 被文件处理器过滤掉了。文件log2.txt中只包含第二个实例的 WARNING 及以上级别日志两个日志实例完全独立。六、总结Python 的logging模块提供了从简单到复杂的日志解决方案快速开始用basicConfig()一行搞定基础配置。精细控制为每个处理器独立设置级别和格式实现“控制台看详情 文件存要害”的分级记录。模块化隔离用getLogger()创建不同命名的实例让各模块的日志互不干扰。掌握这些基础后你还可以进一步探索日志的轮转RotatingFileHandler、过滤器Filter和配置文件logging.config等高级特性构建健壮的应用日志体系。

相关新闻