FastAPI输出日志到控制台被阻塞问题排查

问题如下:

用FastAPI做项目时,为方便本地调试,将日志输出到控制台,但发现日志输出有时会卡住。

排查过程:

原本以为是因为日志同步输出到控制台导致的,改为异步方式后,时不时卡住的问题并没有解决。后面发现Windows下,控制台默认开启了快速编辑模式,在该模式下,鼠标点击了控制台后就进入了编辑模式,日志输出也就卡住了。

找到原因后,解决起来也就简单了,启动项目时关闭快速编辑模式即可:

def _disable_quick_edit_mode() -> None:
    """禁用 Windows 控制台的快速编辑模式,避免点击控制台时阻塞输出"""
    if sys.platform != "win32":
        return
    try:
        import ctypes
​
        kernel32 = ctypes.windll.kernel32
        # 获取标准输入句柄
        handle = kernel32.GetStdHandle(-10)  # STD_INPUT_HANDLE
        # 获取当前控制台模式
        mode = ctypes.c_ulong()
        kernel32.GetConsoleMode(handle, ctypes.byref(mode))
        # 禁用快速编辑模式 (0x0040),启用扩展标志 (0x0080)
        ENABLE_QUICK_EDIT = 0x0040
        ENABLE_EXTENDED_FLAGS = 0x0080
        mode.value = (mode.value & ~ENABLE_QUICK_EDIT) | ENABLE_EXTENDED_FLAGS
        kernel32.SetConsoleMode(handle, mode)
    except Exception:
        pass  # 非 Windows 环境或无控制台时忽略

完整代码可参考:logger

posted @ 2026-08-04 19:54  雪飞鸿  阅读(11)  评论(0)    收藏  举报