Python中能否不按日志级别、而是按指定功能使用logging模块?
你确实是在重复造轮子,Python标准库logging模块原生就内置了完全符合你需求的能力,这种按功能/模块拆分日志管控的场景非常普遍,也是logging设计时就考虑到的核心特性之一。
核心实现逻辑
logging模块的核心设计之一是命名日志器(Named Logger),你可以为每个独立功能/模块单独创建专属的日志器实例,每个实例可以独立设置日志级别、输出渠道等配置,互不干扰。
最简实现示例
首先做全局日志初始化:
import logging import os # 全局默认配置:仅输出INFO及以上级别的日志,所有未单独配置的子日志器都会继承这个配置 logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) # 单独给feature_C开启DEBUG级别的日志输出 logging.getLogger("feature_C").setLevel(logging.DEBUG)
在不同功能模块中使用对应日志器即可:
# feature_A 模块内使用 logger_a = logging.getLogger("feature_A") logger_a.debug("feature_A 调试信息") # 不会输出,默认继承全局INFO级别 logger_a.info("feature_A 运行信息") # 正常输出 # feature_C 模块内使用 logger_c = logging.getLogger("feature_C") logger_c.debug("feature_C 调试信息") # 会输出,单独配置了DEBUG级别 logger_c.info("feature_C 运行信息") # 正常输出
额外优势
你可以直接复用logging的所有原生能力,不需要自己额外开发:
- 自定义日志格式,自带日志时间、代码行号、进程号等内置字段
- 支持输出到文件、控制台、syslog等多种渠道
- 支持日志按大小、时间自动切割、自动清理旧日志
- 支持自定义过滤规则、格式化规则等扩展能力
如果你不想硬编码开关配置,结合os.environ就能实现动态配置,比如从环境变量读取需要开启DEBUG的功能列表,批量设置对应日志器的级别即可。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

