Python导入第三方库时日志无法输出到主脚本指定文件的问题咨询
问题原因
你当前的写法只能捕获当前脚本的日志,本质是Python logging模块的日志传播规则导致的:
- logging的所有logger构成层级树,每个logger的名称用
.分割层级,getLogger(__name__)拿到的是和当前模块路径绑定的logger - 入口脚本的
__name__固定为__main__,你导入的独立库的logger属于自己的名称层级,和__main__没有父子关系,日志不会默认传播到__main__的logger的handler上 - 你库中的日志写法完全符合Python官方规范,不需要修改库代码,也不需要额外传入logger参数,用logging原生能力即可解决
解决方案
方案1:统一捕获所有日志(推荐入门使用)
直接给根logger添加配置,所有未单独关闭传播的logger都会将日志向上传递到根logger,自然就能统一输出到指定文件:
import logging # 不传参数拿到根logger root_logger = logging.getLogger() # 设置日志级别,默认根logger级别为WARNING,低于该级别的日志会被直接丢弃 root_logger.setLevel(logging.INFO) # 配置文件处理器 fh = logging.FileHandler("/some/file/location/log.txt") # 可选:配置日志输出格式,方便排查问题 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) root_logger.addHandler(fh)
方案2:仅捕获指定库的日志
如果不需要捕获其他第三方库的日志,只需要针对你开发的库的顶级包名获取logger,单独添加配置即可:
import logging # 替换为你的库的顶级包名,比如你的库安装后导入语句是import my_lib,此处就填my_lib lib_logger = logging.getLogger("my_lib") lib_logger.setLevel(logging.INFO) fh = logging.FileHandler("/some/file/location/log.txt") lib_logger.addHandler(fh)
补充说明
如果后续需要区分不同库的日志输出路径,只需要按照方案2的方式,针对不同包名的logger单独添加不同的handler即可,不需要修改任何库内部的日志打印逻辑。
内容的提问来源于stack exchange,提问作者zachvac
相关产品推荐
相关产品推荐

