logging.basicConfig() 仅首次调用有效,须在所有 logging.xxx() 前执行;若第三方库已触发日志,需先 clear handlers 再调用;DEBUG/INFO 不显示因 root logger 默认 level 为 WARNING,须显式设 level=logging.DEBUG。

logging.basicConfig() 为什么没生效?
直接调用 logging.basicConfig() 却看不到日志,大概率是——它只在首次调用时起作用,后续再调用无效。比如你在导入某个第三方库后才配置,而该库内部已触发过 logging.info(),此时 root logger 已被初始化,basicConfig() 就静默失效了。
- 必须在所有
logging.xxx()调用前执行,最好放在脚本最顶部(if __name__ == "__main__":之前) - 如果用了
import requests等自带日志的库,它们可能提前触发 root logger 初始化,这时得手动重置:logging.getLogger().handlers.clear()再调basicConfig() -
basicConfig()不影响已有 logger 实例,只配置 root logger;自定义 logger 需单独 setLevel / addHandler
INFO/DEBUG/ERROR 日志不按预期输出?
不是写了 logging.debug("xxx") 就一定显示——它受两层控制:logger 自身的 level 和 handler 的 level。默认 root logger level 是 WARNING,所以 DEBUG 和 INFO 直接被拦在门外。
- 显式设 root level:
logging.basicConfig(level=logging.DEBUG) - 或者分步控制:
logging.getLogger().setLevel(logging.DEBUG)+ 给 handler 单独设 level(如handler.setLevel(logging.INFO)) - 注意大小写:
logging.DEBUG是整数 10,别手误写成字符串"debug",否则报ValueError: Unknown level: 'debug' - DEBUG 日志常被忽略,不是代码错,是 level 挡在前面
想同时输出到终端和文件,但 basicConfig() 不够用
basicConfig() 只支持单个 handler,要双输出(console + file),必须手动创建 logger、handler、formatter 并组装。
- 先获取 root logger:
logger = logging.getLogger()(或命名 logger:logging.getLogger("myapp")) - 清空默认 handler:
logger.handlers.clear(),避免重复打印 - 分别创建
StreamHandler()(终端)和FileHandler("app.log")(文件) - 每个 handler 都要绑定 formatter:
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"),再调handler.setFormatter(formatter) - 最后
logger.addHandler(console_handler)和logger.addHandler(file_handler)
日志时间不准、中文乱码、进程退出后日志丢失?
这些不是功能问题,是环境细节没兜住:
立即学习“Python免费学习笔记(深入)”;
- 时间用 UTC:默认
%(asctime)s基于 time.time(),无时区;加datefmt="%Y-%m-%d %H:%M:%S"和force=True(Python 3.8+)可重置格式 - Windows 控制台中文乱码:终端编码是 gbk,但 logging 默认用 utf-8 写;给
StreamHandler()加参数encoding="gbk" - 日志丢失:程序异常退出(如 SIGKILL)或未 flush,建议
FileHandler(..., delay=True)+ 关键处手动logging.shutdown() - 多进程写同一日志文件会冲突,别用
FileHandler,改用RotatingFileHandler或外部日志服务
真正麻烦的从来不是“怎么打日志”,而是“什么时候打、打到哪、谁能看到、出事了能不能还原上下文”——level、handler、formatter 这三样配齐只是起点,后面还有轮转、过滤、结构化、异步写入要操心。


















