如何优化这段Python日志配置代码?求简化实现方案
简化Python日志配置的方案
核心优化思路
原代码存在大量重复逻辑(重复创建处理器、重复设置格式等),可以通过复用公共配置、封装重复逻辑来简化,同时可以通过共享格式器实现统一格式的效果。
优化后的代码示例
import logging from logging.handlers import RotatingFileHandler # 1. 定义全局通用格式,创建一次格式器对象 LOG_FORMAT = "%(asctime)s %(levelname)s %(message)s" global_formatter = logging.Formatter(LOG_FORMAT) # 配置根日志器的控制台输出 logging.basicConfig( format=LOG_FORMAT, encoding="utf-8", handlers=[logging.StreamHandler()] ) # 2. 封装RotatingFileHandler的创建逻辑,复用公共配置 def build_rotating_handler(file_name): handler = RotatingFileHandler( filename=file_name, maxBytes=5 * 1024 * 1024, backupCount=5 ) handler.namer = lambda name: name.replace(".log.", "") + ".log" handler.setFormatter(global_formatter) # 复用全局格式器 return handler # 3. 创建子日志器,调用封装函数生成处理器 logger_info = logging.getLogger(f"{__name__}_info") logger_info.setLevel(logging.INFO) logger_info.addHandler(build_rotating_handler(f"{__name__}_info.log")) logger_error = logging.getLogger(f"{__name__}_error") logger_error.setLevel(logging.ERROR) logger_error.addHandler(build_rotating_handler(f"{__name__}_error.log")) # 测试日志输出 logger_info.info("test info message 1") logger_error.error("test error message 1") logger_info.info("test info message 2") logger_error.error("test error message 2") logger_info.info("test info message 3") logger_error.error("test error message 3")
关键优化点说明
- 统一格式管理:只定义一次格式字符串,创建全局格式器对象,所有文件处理器共享该格式器,既避免重复代码,也实现了格式的统一维护
- 封装处理器创建:把重复的处理器配置逻辑(文件大小、备份数量、命名规则、格式绑定)封装成函数,只需传入文件名即可生成配置完成的处理器
- 关于格式继承:日志器的处理器不会自动继承根日志器的格式,但通过共享同一个
Formatter对象,能达到和"继承"一致的效果,且更灵活可控
可选优化:利用日志器继承
如果希望子日志器继承根日志器的级别等配置,可以调整为子日志器结构,同时控制日志传播行为:
# 根日志器设置基础级别为INFO logging.basicConfig( level=logging.INFO, format=LOG_FORMAT, encoding="utf-8", handlers=[logging.StreamHandler()] ) # 创建根日志器的子日志器,自动继承根配置 logger_info = logging.getLogger(f"{__name__}.info") logger_info.addHandler(build_rotating_handler(f"{__name__}_info.log")) logger_info.propagate = False # 避免日志重复输出到控制台 logger_error = logging.getLogger(f"{__name__}.error") logger_error.setLevel(logging.ERROR) # 覆盖继承级别,只处理ERROR及以上日志 logger_error.addHandler(build_rotating_handler(f"{__name__}_error.log"))
内容的提问来源于stack exchange,提问作者NickC
相关产品推荐
相关产品推荐

