Kivy Logger在PYTHON模式下将Python异常识别为警告的问题求助
解决Kivy未捕获异常被标记为WARNING级别的问题
问题原因
当设置Logger.mode = "PYTHON"时,Kivy的Logger会捕获标准错误流(stderr)的输出,并默认以WARNING级别记录。未被捕获的Python异常会输出到stderr,因此被Kivy Logger拦截后标记为WARNING,即使程序已经终止。
解决方案
方案1:修改Kivy Logger的stderr日志级别
直接调整Kivy Logger中stderr logger的级别,将其从WARNING改为ERROR:
import logging logging.basicConfig( filename = "log.log", filemode = "w", encoding = "utf-8", force = True, level = logging.INFO, format = "%(asctime)s %(levelname)-8s %(message)s", datefmt = "%Y-%m-%d %H:%M:%S" ) from kivy.logger import Logger, LOG_LEVELS Logger.mode = "PYTHON" # 修改stderr logger的级别为ERROR Logger.setLevel('stderr', LOG_LEVELS['error'])
方案2:用Python logging接管未处理异常
通过Python logging模块结合sys.excepthook接管未捕获异常的处理,确保异常以ERROR级别记录,同时避免被Kivy Logger以WARNING捕获:
import logging import sys def handle_uncaught_exception(exc_type, exc_value, exc_traceback): if issubclass(exc_type, KeyboardInterrupt): # 保留键盘中断的默认处理逻辑 sys.__excepthook__(exc_type, exc_value, exc_traceback) return # 以ERROR级别记录完整异常信息 logging.error("未捕获的异常", exc_info=(exc_type, exc_value, exc_traceback)) sys.excepthook = handle_uncaught_exception logging.basicConfig( filename = "log.log", filemode = "w", encoding = "utf-8", force = True, level = logging.INFO, format = "%(asctime)s %(levelname)-8s %(message)s", datefmt = "%Y-%m-%d %H:%M:%S" ) from kivy.logger import Logger Logger.mode = "PYTHON"
配置后,未捕获的异常会直接通过Python logging以ERROR级别写入日志,不会被Kivy Logger转为WARNING。
方案3:禁用Kivy对stderr的捕获
如果不需要Kivy处理stderr输出,可以直接关闭该功能,但需结合方案2才能将异常记录到日志文件:
import logging import sys def handle_uncaught_exception(exc_type, exc_value, exc_traceback): if issubclass(exc_type, KeyboardInterrupt): sys.__excepthook__(exc_type, exc_value, exc_traceback) return logging.error("未捕获的异常", exc_info=(exc_type, exc_value, exc_traceback)) sys.excepthook = handle_uncaught_exception logging.basicConfig( filename = "log.log", filemode = "w", encoding = "utf-8", force = True, level = logging.INFO, format = "%(asctime)s %(levelname)-8s %(message)s", datefmt = "%Y-%m-%d %H:%M:%S" ) from kivy.logger import Logger Logger.mode = "PYTHON" # 关闭Kivy对stderr的捕获 Logger.stderr = False
内容的提问来源于stack exchange,提问作者Abel Gutiérrez
相关产品推荐
相关产品推荐

