Node.js console.log - Is it possible to update a line rather than create a new line?

Javascriptnode.js

Javascript Problem Overview


My node.js application has a lot of console logs, which are important for me to see (it's quite a big app so runs for a long time and I need to know that things are still progressing) but I'm ending up with thousands of lines of console logs.

Is it somehow possible to do a console.update that erases/replaces a console line rather than creating a new line?

Javascript Solutions


Solution 1 - Javascript

Try playing with process.stdout methods instead on console:

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

TypeScript: clearLine() takes -1, 0, or 1 as a direction parameter with the following meanings:

>-1: to the left from cursor.
0: the entire line.
1 - to the right from cursor

Solution 2 - Javascript

Following @michelek's answer, you can use a function somewhat like this:

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

Solution 3 - Javascript

Sure, you can do this using a module I helped create: fknsrs/jetty

Install via

npm install jetty

Here's a usage example

// 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 is not super useful when used on it's own. It is much more effective when you build some abstraction on top of it to make your jetty calls less verbose.

Solution 4 - Javascript

Just use \r to terminate your line:

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

Here's a simple example (wall clock):

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

Solution 5 - Javascript

To write a partial line.

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

If the volume of output is the real issue then you'll probably to rethink your logging. You could use a logging system that allows selective runtime logging to narrow your output to what you need.

// 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

Solution 6 - Javascript

if you see stdout exceptions like TypeError: process.stdout.clearLine is not a function in Debug Console window of Visual Studio Code (or Webstorm), run the app as external terminal application instead of internal console. The reason is that Debug Console window is not TTY (process.stdout.isTTY is false). Therefore update your launch configuration in launch.json with "console": "externalTerminal" option.

Solution 7 - Javascript

We can use log-update

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

Solution 8 - Javascript

Among others, the answer by @michelek does the trick. However, when you start using this, you may run into Exception trouble when output gets redirected to a file or you are in a debugger or running in a linux screen-session, etc. You may see messages such as process.stdout.clearLine is not a function.

Therefore, at least add a test to check that the output is a 'TTY' and is able to do such things as 'clearLine()' and '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
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJVGView Question on Stackoverflow
Solution 1 - JavascriptmichelekView Answer on Stackoverflow
Solution 2 - JavascriptBruno PeresView Answer on Stackoverflow
Solution 3 - JavascriptMulanView Answer on Stackoverflow
Solution 4 - JavascriptBart TheetenView Answer on Stackoverflow
Solution 5 - JavascriptSpliFFView Answer on Stackoverflow
Solution 6 - JavascriptMaksim ShamihulauView Answer on Stackoverflow
Solution 7 - JavascriptPKVView Answer on Stackoverflow
Solution 8 - JavascriptannebView Answer on Stackoverflow