Python logging如何禁止第三方库函数日志写入自定义日志文件
屏蔽Python第三方库日志输出的简便方案
你当前用logging.basicConfig直接配置根日志记录器(root logger)时,所有未单独配置的子日志记录器(第三方库基本都会用自己独立命名的子logger)产生的、满足级别要求的日志,都会向上冒泡传递到根logger的handler写入文件,这是日志混写的核心原因。不需要用临时切换日志文件的冗余方案,下面两种实现都很简便:
方案1:保留现有
basicConfig配置,加过滤器/单独设置第三方库日志级别
如果你不想改动现有打日志的代码逻辑,可以在basicConfig初始化完成后补配置:如果你明确知道要屏蔽的第三方库的logger名(通常和库的导入包名一致,比如requests库的logger名就是
requests),直接给对应logger设更高的输出阈值即可,要完全屏蔽就设为比CRITICAL更高的级别:# 替换成你要屏蔽的第三方库的logger名 logging.getLogger("third_party_lib_name").setLevel(logging.CRITICAL + 1)如果要批量放行仅自己项目的日志,可以给根logger的handler加自定义过滤器:
logging.basicConfig(level = logging.INFO,filename = loggingFile,format = "%(message)s") class OwnProjectFilter(logging.Filter): def filter(self, record): # 替换成你自己项目的根包名,比如你所有业务代码都在app包下就填"app" return record.name.startswith("your_project_root_package") # 给根logger下所有绑定的日志处理器加上过滤器 for handler in logging.root.handlers: handler.addFilter(OwnProjectFilter())方案2:单独初始化项目专属logger(推荐实践)
生产环境更推荐不要直接用根logger打业务日志,单独给自己的项目创建专属logger实例,同时把根logger的级别调高屏蔽所有未单独配置的第三方日志,完全避免配置冲突:import logging # 初始化项目专属logger,名称用自己项目的根包名即可 logger = logging.getLogger("your_project_root_package") logger.setLevel(logging.INFO) # 配置专属文件处理器 file_handler = logging.FileHandler(loggingFile) file_handler.setFormatter(logging.Formatter("%(message)s")) logger.addHandler(file_handler) # 调高根logger级别,屏蔽所有第三方库的日志向上传递 logging.root.setLevel(logging.CRITICAL + 1) # 后续业务代码打日志统一用这个专属logger即可 logger.info("这行是项目自身的日志,会正常写入文件")这种方案一次配置后不需要额外维护,也不会影响第三方库内部的日志逻辑,只是不会把它们的日志写到你自己的日志文件里。
内容的提问来源于stack exchange,提问作者YozNacks
相关产品推荐
相关产品推荐

