Node.js console.log-新しい行を作成するのではなく、行を更新することは可能ですか?


83

私のnode.jsアプリケーションには多くのコンソールログがあり、これは私が見るのに重要です(非常に大きなアプリなので、長時間実行され、状況がまだ進行中であることを知る必要があります)が、何千行もの行になってしまいます。コンソールログ。

console.update新しい行を作成するのではなく、コンソール行を消去/置換することはどういうわけか可能ですか?


1
監視や検索ができるログファイルに書き込んでみませんか?
ネルソン

1
PowerShellでそれを簡単に行うことができますが、10行を簡単に占める可能性のある約5,000行のコンソールが記述されているだけではありません(ほとんどは、状況が進行中であることを通知する呼び出しであり、これはアプリは約20分間実行され、問題が発生しているかどうか、またはまだ実行されているかどうかについてのフィードバックが必要です)。
JVG 2013年

これはあなたの質問に答えますか?コンソールに印刷された文字を消去する方法
Wex 2010年

回答:


127

コンソールではなく、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で実行することはできません。
トレバー

@TrevorDこれに対する私のアプローチはwebstorm=true、webstormノード構成にアプリケーションパラメーターを追加し、process.argv.find(x => x.startsWith('webstorm=true')この回答の使用を確認することでした
Luiz Eduardo

1
@Luiz Eduardoただ包むのは簡単ではないでしょうif (process.stdout.clearLine) { process.stdout.clearLine() }か?
トレバー

いいキャッチ!どういうわけか、私はそれさえ考えていませんでした。コンソールで実行するための小さなシンプルなツールを作成していたので、完全には説明しませんでしたが、間違いなく変更します。ありがとうございます。
ルイスエドゥアルド

私はこれを行います: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')}"
ケルベロス

55

@michelekの回答に従って、次のような関数を使用できます。

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

1
これをforループで使用すると、ちらつきますが、これを修正する方法はありますか?
Ank izle20年

1
ちらつきを修正するには、process.stdout.clearLine()
削除します

これを大きなループに追加すると、計算時間が大幅に増えることに気づきました。たとえば、1億回のランダム試行を実行し、変数に割り当てています。3秒かかるはずです。この機能で。1分ほどかかります
MjJameel20年

私の上記のコメントを気にしないでください。私はすべてのコンソールログがたくさんかかると思います。進捗状況をパーセンテージで印刷しようとしていたので、1%2%などの特定の間隔でのみ印刷する関数を作成する必要がありました
Mj Jameel 2010

21

確かに、私が作成を手伝ったモジュールを使用してこれを行うことができます: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");

Jettyを単独で使用する場合、あまり役に立ちません。その上に抽象化を構築して、桟橋の呼び出しの冗長性を減らすと、はるかに効果的です。


3
このパッケージのライセンスが制限されているため、私はこれに反対しました。
mmmeff

17
これは、標準のBSD3条項ライセンスです。反対票を投じるのはかなり悪い理由です、imo。
感謝します

6
@ mmmeff、BSD 3条項ライセンスが制限的だと思うなら、GPLとAGPLライセンスについて聞いたときにあなたが死ぬのではないかと心配しています。
MichaelPfaff20年

15

部分的な行を書くこと。

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 functionVisual Studio Code(またはWebstorm)の[デバッグコンソール]ウィンドウのようにstdout例外が発生した場合は、アプリを内部コンソールではなく外部ターミナルアプリケーションとして実行します。その理由は、デバッグコンソールウィンドウがTTYではない(process.stdout.isTTYfalse)ためです。したがってlaunch.json"console": "externalTerminal"オプションを使用して起動構成を更新してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.