问题如下:
用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