Python中如何根据日志级别设置独立输出文件与行为?
解决方案
核心思路
- 自定义延迟创建文件的FileHandler:彻底解决初始化就生成空文件的问题,只有当对应级别的日志实际写入时才创建文件
- 单Logger+动态Handler配置:用一个主Logger统一管理,根据运行模式动态添加对应Handler,避免多Logger配置混乱
- 分场景配置:区分调试模式和用户交付模式,精准匹配两种场景的日志输出需求
实现代码
1. 自定义延迟创建的FileHandler
import logging import os class LazyFileHandler(logging.FileHandler): def __init__(self, filename, mode='a', encoding=None): # 初始化时不创建文件,强制开启延迟模式 super().__init__(filename, mode, encoding, delay=True) self.file_created = False def emit(self, record): if not self.file_created: # 第一次写入日志时才真正创建并打开文件 self.stream = self._open() self.file_created = True super().emit(record)
2. 日志配置函数
def setup_logger(debug_mode=False): # 用根Logger简化配置,避免多Logger冲突 logger = logging.getLogger() logger.setLevel(logging.DEBUG if debug_mode else logging.WARNING) logger.handlers.clear() # 清空默认Handler,防止重复输出 if debug_mode: # 调试模式:debug/info同时输出到控制台+专属文件;warning仅输出到控制台 # 控制台Handler:输出所有>=DEBUG的日志 console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) logger.addHandler(console_handler) # Debug专属文件Handler:仅处理DEBUG级日志 debug_file_handler = LazyFileHandler('debug.txt') debug_file_handler.setLevel(logging.DEBUG) debug_file_handler.addFilter(lambda r: r.levelno == logging.DEBUG) debug_file_handler.setFormatter(formatter) logger.addHandler(debug_file_handler) # Info专属文件Handler:仅处理INFO级日志 info_file_handler = LazyFileHandler('info.txt') info_file_handler.setLevel(logging.INFO) info_file_handler.addFilter(lambda r: r.levelno == logging.INFO) info_file_handler.setFormatter(formatter) logger.addHandler(info_file_handler) else: # 用户交付模式:warning/error仅输出到文件,不显示控制台 warn_error_handler = LazyFileHandler('warn_error.txt') warn_error_handler.setLevel(logging.WARNING) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') warn_error_handler.setFormatter(formatter) logger.addHandler(warn_error_handler) return logger
3. 使用示例
if __name__ == '__main__': # 调试模式启动:传入True logger = setup_logger(debug_mode=True) # 用户模式启动:传入False # logger = setup_logger(debug_mode=False) # 测试日志输出 logger.debug("这是一条debug日志") logger.info("这是一条info日志") logger.warning("这是一条warning日志") logger.error("这是一条error日志")
关键细节说明
- LazyFileHandler:通过重写
emit方法,把文件创建时机推迟到第一条日志写入时,完全避免空文件生成 - 日志过滤:用
addFilter精准控制每个文件Handler只处理对应级别的日志,实现独立文件存储 - 模式切换:仅通过
debug_mode一个参数就能切换两种运行模式,配置逻辑集中,不会出现多Logger配置错误 - 清空默认Handler:避免Python自带的根Logger默认输出干扰,确保日志完全按自定义规则输出
内容的提问来源于stack exchange,提问作者krusion
相关产品推荐
相关产品推荐

