PUDB调试出现_io.TextIOWrapper等冗余DEBUG输出,如何屏蔽?
问题描述
在终端环境(通过PuTTY连接Ubuntu 20,无XServer)使用python3 -m pudb.run <脚本名及参数>启动PuDB调试时,终端持续输出PuDB依赖模块的冗余DEBUG日志,覆盖调试窗口,示例日志如下:
2024-11-25 11:13:30,601 DEBUG Waiting for input: descriptors=[<socket.socket fd=3, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>, <_io.TextIOWrapper name='
' mode='r' encoding='utf-8'>], timeout=0
2024-11-25 11:13:30,601 DEBUG Input ready: [(SelectorKey(fileobj=<_io.TextIOWrapper name='' mode='r' encoding='utf-8'>, fd=0, events=1, data=None), 1)]
2024-11-25 11:13:30,601 DEBUG Decoded codes: ['down'], raw codes: [27, 91, 66]
2024-11-25 11:13:30,603 DEBUG Drawing screen with size (237, 63)
程序自身日志级别设为DEBUG,但使用pdb调试时无此问题,推测是PuDB依赖模块(如urwid、prompt-toolkit等)的DEBUG日志输出到了stdout。
解决方案
方法1:临时调整依赖模块日志级别
在脚本开头添加代码,针对性降低PuDB依赖模块的日志输出级别:
import logging # 针对常见PuDB依赖模块设置日志级别为INFO(高于DEBUG) logging.getLogger("urwid").setLevel(logging.INFO) logging.getLogger("prompt_toolkit").setLevel(logging.INFO) logging.getLogger("pudb").setLevel(logging.INFO)
若不确定具体模块,可批量调整非自身程序的日志级别:
import logging # 替换为你的程序日志命名空间前缀,避免影响自身DEBUG日志 MY_APP_LOG_PREFIX = "myapp" for logger_name in logging.root.manager.loggerDict: if not logger_name.startswith(MY_APP_LOG_PREFIX): logging.getLogger(logger_name).setLevel(logging.INFO)
方法2:通过启动命令控制日志
直接在启动PuDB时嵌入日志级别设置逻辑:
python3 -c "import logging; logging.getLogger('urwid').setLevel(logging.INFO); logging.getLogger('prompt_toolkit').setLevel(logging.INFO); from pudb.run import main; main()" <脚本名及参数>
方法3:修改PuDB全局配置
编辑PuDB用户配置文件~/.config/pudb/pudb.cfg,添加或修改[Logging]节,全局降低日志输出级别:
[Logging] level = INFO
保存配置后重启PuDB即可生效。
方法4:重定向冗余日志到空设备
如果上述方法无效,可临时将stderr(多数日志输出到该流)重定向到/dev/null,注意此方法会屏蔽所有错误日志:
python3 -m pudb.run <脚本名及参数> 2>/dev/null
内容的提问来源于stack exchange,提问作者simonhaven

