日志不输出的首要原因是Logger级别设得过高:默认WARNING会过滤INFO及更低级别日志;需检查logger.level并显式设为DEBUG或INFO,同时确认Handler已添加、其level已设置、formatter已配置。

Logger本身级别太低,日志被直接过滤掉
这是最常见原因:即使你调用了 logger.error("xxx"),如果 logger 实例的级别设为 WARNING 或更高,ERROR 日志仍会被放行;但若设为 INFO 或 DEBUG,反而不会拦截——真正的问题常出在「设得太高」。比如手动创建 logger 后忘了调用 setLevel(),它默认是 WARNING,此时 logger.info("test") 就完全静默。
- 检查方式:打印
logger.level,确认是否 ≥ 你试图输出的日志级别(DEBUG=10,INFO=20,WARNING=30,ERROR=40,CRITICAL=50) - 修复建议:显式设置
logger.setLevel(logging.DEBUG)(或按需选INFO) - 注意:根 logger 的级别(
logging.getLogger().level)也会影响未显式配置的 logger,尤其在没传 name 时容易误用根 logger
Handler没加进去,或者Handler自己也被设高了
Logger 负责判断“要不要记”,Handler 负责“记到哪、怎么记”。两者级别独立生效:Logger 放行后,Handler 还会再比一次自己的 level。常见错误是只给 logger 设了 DEBUG,却忘了给 StreamHandler 或 FileHandler 设级别,而 Handler 默认继承根 logger 级别(通常是 WARNING)。
- 检查方式:遍历
logger.handlers,对每个 handler 打印h.level - 修复建议:为 handler 显式调用
handler.setLevel(logging.DEBUG) - 典型漏操作:用
logging.basicConfig()配置过一次后,再手动创建 logger + handler,但没删掉 basicConfig —— 它会悄悄添加一个默认 StreamHandler 到根 logger,干扰你的自定义逻辑
根本没把Handler绑定到Logger上
新手常以为只要创建了 StreamHandler 就自动生效,其实必须显式调用 logger.addHandler(handler)。不加这句,无论 logger 和 handler 级别多低,日志都进不了输出流。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 检查方式:打印
logger.handlers,结果为空列表[]就是没绑 - 修复建议:确保有类似
logger.addHandler(console_handler)的语句,且执行时机在首次logger.xxx()之前 - 注意:多次调用
addHandler()会导致重复输出,可先用logger.handlers.clear()清理(调试期有用)
Formatter没设导致输出为空或不可见
Handler 有级别限制,Formatter 没有,但它决定“输出什么内容”。如果只创建了 handler 但没 setFormatter,某些场景下(尤其是自定义 handler 或重定向到文件时)可能输出空行、纯时间戳、甚至完全无内容——看着像没打印,其实是格式化后字段为空。
立即学习“Python免费学习笔记(深入)”;
- 检查方式:对 handler 打印
handler.formatter,为None就是没设 - 修复建议:至少配一个基础 formatter,例如
formatter = logging.Formatter("%(levelname)s - %(message)s"),再handler.setFormatter(formatter) - 特别提醒:Jupyter 或某些 IDE 控制台对 ANSI 颜色码/特殊字符敏感,若 Formatter 中含
%(asctime)s且未设datefmt,可能导致整行被截断或渲染异常,看起来像“消失”
实际排查时,优先按顺序检查 logger.level → handler 是否存在 → handler.level → handler.formatter。四个环节里任一关卡住,日志就停在那一步,不会继续往下走。


















