Node.js console.log-是否可以更新行而不是创建新行?


80

我的node.js应用程序有很多控制台日志,这对我来说很重要(这是一个很大的应用程序,因此运行了很长时间,我需要知道事情仍在进行中),但最终却出现了数千行控制台日志。

是否可以通过某种方式console.update擦除/替换控制台行而不是创建新行?


1
为什么不写可以监视或搜索的日志文件?
尼尔森

1
我可以在PowerShell中很容易地做到这一点,但更多的是,我编写了约5,000行控制台,可以轻松占用10行(其中大多数只是调用,让我知道事情进展顺利,这很重要)。应用程序运行了大约20分钟,我需要有关是否中断/仍在运行的反馈)。
JVG 2013年

这回答了你的问题了吗?如何清除控制台中打印的字符
Wex

Answers:


123

尝试在控制台上使用process.stdout方法:

process.stdout.write("Hello, World");
process.stdout.clearLine();
process.stdout.cursorTo(0);
process.stdout.write("\n"); // end the line

10
TypeError:process.stdout.clearLine不是函数。如果其他人遇到此问题,则无法在webstorm中运行。
Trevor

@TrevorD我的解决方法是webstorm=true在webstorm节点配置中添加应用程序参数,并检查是否process.argv.find(x => x.startsWith('webstorm=true')使用此答案
Luiz Eduardo

1
@Luiz Eduardo包裹起来会不会更简单if (process.stdout.clearLine) { process.stdout.clearLine() }
Trevor

接得好!由于某种原因,我什至没有想到这一点。当我在构建一个可以在控制台中运行的简单工具时,虽然并没有对其进行全面介绍,但是我一定会对其进行更改,谢谢!
Luiz Eduardo

我会这样做:node -e "for(let i=1;i<=1000;i++){process.stdout.write('Hello, World'); if(i<10)process.stdout.clearLine(); process.stdout.cursorTo(0);}"node -e "for(let i=1;i<=1000;i++){process.stdout.clearLine(); process.stdout.cursorTo(0); process.stdout.write('hello, world')}"
Cerberus

54

按照@michelek的回答,您可以使用类似以下的功能:

function printProgress(progress){
    process.stdout.clearLine();
    process.stdout.cursorTo(0);
    process.stdout.write(progress + '%');
}

1
将其与for循环一起使用时,它会闪烁,有什么办法可以解决此问题?
Ank i zle

1
要解决闪烁问题,请摆脱process.stdout.clearLine()
解码器7283年

我意识到将其添加到大循环中会大大增加计算时间。例如,我正在运行1亿次随机尝试并分配给变量。这需要3秒钟。具有此功能。
Mj Jameel

没关系,我的上述评论。我猜所有控制台日志都花费很多。并且由于我试图按百分比打印进度,所以我不得不编写一个仅按一定间隔打印的函数,例如1%2%等
Mj Jameel

20

当然,您可以使用我帮助创建的模块执行此操作:fknsrs / jetty

通过安装

npm install jetty

这是一个用法示例

// Yeah, Jetty!
var Jetty = require("jetty");

// Create a new Jetty object. This is a through stream with some additional
// methods on it. Additionally, connect it to process.stdout
var jetty = new Jetty(process.stdout);

// Clear the screen
jetty.clear();

// write something
jetty.text("hello world");
jetty.moveTo([0,0]);
jetty.text("hello panda");

单独使用码头并不是超级有用。当您在其上构建一些抽象以减少码头呼叫的详细程度时,它会更加有效。


3
由于该软件包的限制性许可证,我对此表示反对。
mmmeff

16
这是标准的BSD 3子句许可。反对投票的坏理由,imo。
谢谢您,

6
@mmmeff,如果您认为BSD 3子句许可证具有限制性,我担心听到GPL和AGPL许可证后您会死掉。
Michael Pfaff

14

写一个分行。

process.stdout.write("text");
process.stdout.write("more");
process.stdout.write("\n"); // end the line

如果输出量是真正的问题,那么您可能需要重新考虑日志记录。您可以使用允许选择运行时日志记录的日志系统,以将输出范围缩小到所需的范围。

// The sections we want to log and the minimum level
var LOG_LEVEL = 4;
var LOG_SECTIONS = ["section1","section2","section3"];

function logit(msg, section, level) {
  if (LOG_SECTIONS.indexOf(section) > -1 && LOG_LEVEL >= level) {
    console.log(section + ":" + msg);
  }
}

logit("message 1", "section1", 4); // will log
logit("message 2", "section2", 4); // will log
logit("message 3", "section3", 2); // wont log, below log level
logit("message 4", "section4", 4); // wont log, not in a log section

6

只需使用\ r终止您的行即可:

process.stdout.write('text\r');

这是一个简单的示例(挂钟):

setInterval(() => process.stdout.write(`clock: ${new Date()}\r`), 1000);

这行得通,但是如果“更改”行比上一行短,它将在终端中保留一些旧字符。
Matthijn

5

如果您TypeError: process.stdout.clearLine is not a function在Visual Studio Code(或Webstorm)的“调试控制台”窗口中看到stdout异常,请将该应用程序作为外部终端应用程序而不是内部控制台运行。原因是“调试控制台”窗口不是TTY(process.stdout.isTTY为false)。因此,launch.json使用"console": "externalTerminal"选项更新启动配置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.