Log-可以更新一行而不是创建一行吗?

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

是否有可能以某种方式执行擦除/替换控制台行而不是创建新行的 console.update

76387 次浏览

写部分行。

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.includes(section) && 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

当然,您可以使用我帮助创建的模块 防波堤/码头来完成这项工作

安装通过

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");

单独使用 Jetty 并不是特别有用。当您在它之上构建一些抽象时,它会更加有效,从而使您的 jetty 调用不那么冗长。

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

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

TypeScript: clearLine()采用 -1、0或1作为方向参数,其含义如下:

-1: 从光标向左。
0: 整个生产线。
从光标向右

在@michelek 的回答后面,你可以使用一个类似这样的函数:

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

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

只要使用 r 来终止您的行:

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

下面是一个简单的例子(挂钟) :

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

我们可以用 日志更新

const logUpdate = require('log-update');
logUpdate('this will be gone');
logUpdate('this will stay');

在其他问题中,@michelek 的回答起到了作用。但是,当您开始使用它时,当输出被重定向到一个文件时,或者当您在调试器中或在 linux 屏幕会话中运行时,您可能会遇到 Exception 问题,等等。您可能会看到诸如 process.stdout.clearLine is not a function之类的消息。

因此,至少添加一个测试来检查输出是否为“ TTY”,并且能够执行诸如“ clearLine ()”和“ cursorTo ()”之类的操作:

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