如何在node.js CLI应用程序中使用日志和进度条?

mkh04yzy  于 2023-02-18  发布在  Node.js
关注(0)|答案(3)|浏览(211)

背景

在Node.js应用程序中,我使用:

CLI应用程序将在构建文件时显示进度条。在构建操作期间,有时需要将信息/错误记录到控制台。这会干扰进度条,因为:

  • 信息/错误在进度条之后立即记录到控制台,而不是在换行符上
  • 日志完成后,进度条将再次打印,从而在控制台中打印多个进度条

控制台图示:

[===========----------------------] 11 / 33 builtwarn: something wrong here.
[=============--------------------] 13 / 33 builtwarn: something wrong here.
warn: example warning that continues here.
error:  some stacktrace
[=================================] 33 / 33 built

问题

是否有办法确保进度条不受干扰,并且控制台的任何信息日志都打印在进度条的上方/下方?例如,只显示一个进度条。
我知道node-progress中有一个interrupt方法,但我不确定如何在winston中使用它。
我可以想象这是CLI应用程序中相当常见的场景,所以任何关于如何通过其他依赖项/方法来实现它的建议/想法都将受到赞赏!

bzzcjhmw

bzzcjhmw1#

我自己开了一个进度条课程。
您可以打印\r以清除屏幕上的最后一行。
然后打印日志。
之后,打印\n,确保新进度条不会清除您的日志。

class MyProgress {
    constructor(total,str_left,str_right){
        this.str_left=".";
        this.str_right=" ";
        if(str_left)this.str_left=str_left;
        if(str_right)this.str_right=str_right;
        this.total = total;
        this.current=0;
        this.strtotal=60;//progress bar width。
    }
    update(current){
        this.current++;
        if(current)this.current=current;        
        var dots=this.str_left.repeat(parseInt( (this.current % this.total) /this.total*this.strtotal));
        var left = this.strtotal - parseInt( (this.current % this.total) /this.total*this.strtotal);
        var empty = this.str_right.repeat(left);
        process.stdout.write(`\r[${dots}${empty}] ${parseInt(this.current/this.total * 100)}% [${this.total}-${this.current}]`);
        //if(this.total <= this.current){ this.current=0; }//
    }   
}
function print(params,...other){
    process.stdout.write("\r");
    console.log(params,...other);//
    process.stdout.write("\n");
}
x8goxv8g

x8goxv8g3#

同样的问题,但是我使用cli-progress和log4js,我没有找到比将日志从控制台重定向到文件更好的解决方案。

相关问题