设置RichHandler自定义日志颜色后,使用rich.progress出现打印溢出问题求助
Rich日志与Progress组件共存时的打印溢出问题解决
自定义了SUCCESS日志级别并通过Theme设置颜色后,单独使用日志功能正常,但结合rich.progress组件时会出现打印溢出/输出混乱的问题,本质是动态进度条与日志输出的终端上下文冲突导致的。以下是两种可行的解决方案:
方法一:共享全局Console实例
创建唯一的Console对象同时传给RichHandler和Progress,让两者共用同一个终端输出上下文,Rich会自动处理进度条与日志的显示顺序,避免互相干扰。
修改后的完整代码:
import logging from rich.logging import RichHandler from time import sleep from rich.theme import Theme from rich.console import Console from rich.progress import Progress # 创建全局Console实例并自定义主题 console = Console(theme=Theme({"logging.level.success": "green"})) FORMAT = "%(message)s" logging.basicConfig( level="NOTSET", format=FORMAT, datefmt="[%X]", handlers=[RichHandler(console=console)] ) log = logging.getLogger("rich") log.info("Hello, World!") # 注册自定义SUCCESS级别 logging.addLevelName(25, "SUCCESS") # 传入同一个console初始化Progress with Progress(console=console) as progress: task = progress.add_task("Working", total=None) for i in range(0,100): if i < 30: logging.log(25, i+1) elif i >= 30 and i < 50: log.error(i+1) elif i >= 50 and i < 70: log.debug(i+1) elif i >= 70: log.critical(i+1) else: log.warning(i+1) sleep(0.05)
注:原代码的elif顺序存在逻辑错误(i > 30会优先匹配所有大于30的情况,导致后续条件无法触发),已在上述代码中修正。
方法二:使用Progress内置日志功能
直接利用Progress的log方法输出日志,日志会自动显示在进度条下方,无需额外配置logging体系,适合仅在进度任务内输出状态的场景:
示例代码片段:
with Progress(console=console) as progress: task = progress.add_task("Working", total=None) for i in range(0,100): if i < 30: progress.log(f"[green]SUCCESS[/] {i+1}") elif i >= 30 and i < 50: progress.log(f"[red]ERROR[/] {i+1}") elif i >= 50 and i < 70: progress.log(f"[blue]DEBUG[/] {i+1}") elif i >= 70: progress.log(f"[bold red]CRITICAL[/] {i+1}") else: progress.log(f"[yellow]WARNING[/] {i+1}") sleep(0.05)
内容的提问来源于stack exchange,提问作者Ankush Bhagat
相关产品推荐
相关产品推荐

