You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:33:12