Python中StreamHandler日志无法正常工作,求正确日志函数编写方法
问题分析与修复方案
你的代码存在几个关键问题,导致日志无法正常工作,逐一修复如下:
1. Logger对象被错误覆盖
你先获取了Logger对象logger = logging.getLogger(__name__),但紧接着将其重新赋值为StreamHandler实例,完全混淆了Logger与Handler的角色。Logger是日志的入口,Handler负责输出日志,正确操作是将Handler添加到Logger中,而非覆盖Logger对象。
2. 环境变量检查逻辑错误
你循环的是变量名字符串列表ENV_VARS,直接判断var is None永远不会成立(因为var是字符串),应该检查环境变量的实际值是否为空,需要导入os模块读取环境变量。
3. 其他细节问题
- 拼写错误:
unavailible应改为unavailable - 异常类
exсeptions.NoValidTokenError存在拼写错误(应为exceptions),且未定义或导入该异常类 - 建议显式设置日志级别,避免因默认级别(WARNING)导致低级别日志不输出
修复后的完整代码
import logging import sys import os # 配置日志基础格式与级别 logging.basicConfig( format='%(asctime)s %(levelname)s %(message)s', level=logging.CRITICAL ) logger = logging.getLogger(__name__) # 创建StreamHandler并添加到logger(若basicConfig未自动创建则补充) handler = logging.StreamHandler(stream=sys.stdout) handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) logger.addHandler(handler) logger.setLevel(logging.CRITICAL) # 自定义异常类(若无现成实现) class NoValidTokenError(Exception): pass ENV_VARS = ['API_TOKEN', 'TELEGRAM_TOKEN', 'TELEGRAM_CHAT_ID'] def check_tokens(): for var in ENV_VARS: token_value = os.getenv(var) if token_value is None or token_value.strip() == '': logger.critical(f'Token {var} unavailable') raise NoValidTokenError(f'Token {var} unavailable')
核心修复点总结
- 不要覆盖Logger对象,而是将StreamHandler添加到Logger实例中
- 正确读取并校验环境变量的实际值,而非变量名本身
- 修正拼写错误,确保异常类可被正确调用
- 显式设置日志级别,避免因默认配置导致日志不输出
内容的提问来源于stack exchange,提问作者Maivery
相关产品推荐
相关产品推荐

