except块中调用logger.error导致程序停止运行的问题如何解决?
问题排查与解决方案
1. 补全日志基础配置
你当前仅通过logging.getLogger(__name__)初始化了日志实例,未配置handler、日志级别、输出格式等核心参数,会触发默认行为的缓冲或者无输出问题,3.7版本适配调整方案如下:
import logging import sys logger = logging.getLogger(__name__) # 清空继承自root logger的旧handler,避免配置冲突 for handler in logger.handlers[:]: logger.removeHandler(handler) # 自定义带强制刷新的日志handler class AutoFlushStreamHandler(logging.StreamHandler): def emit(self, record): super().emit(record) self.flush() # 添加输出到stdout的handler handler = AutoFlushStreamHandler(sys.stdout) handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")) logger.addHandler(handler) # 设置日志级别 logger.setLevel(logging.INFO) # 禁止日志向上传递到root logger,避免重复输出 logger.propagate = False
2. 排查日志内容的二次异常
若调整配置后问题仍存在,先将logger.error(f'Response from {service_url} is {error}')替换为固定字符串测试:
logger.error("请求异常触发")
如果固定字符串可以正常输出,说明原日志的f-string插值过程触发了额外异常:
- 检查
service_url是否为非字符串类型、空值等会导致插值报错的场景 - 检查捕获的
error对象是否存在__str__方法报错的异常情况
3. 排查多进程场景死锁
如果你的程序使用了multiprocessing模块启动子进程,logging模块的全局锁会在fork时被继承到子进程,若父进程获取锁的阶段触发fork,子进程调用日志时会直接死锁。这种场景需在每个子进程的初始化逻辑中重新执行一遍上述的日志配置代码,清空从父进程继承的所有handler。
内容的提问来源于stack exchange,提问作者jemd13
相关产品推荐
相关产品推荐

