151 votes

Node.js console.log - Est-il possible de mettre à jour une ligne plutôt que d'en créer une nouvelle ?

Mi node.js a beaucoup de journaux de console, qu'il est important pour moi de voir (il s'agit d'une application assez importante qui fonctionne pendant longtemps et j'ai besoin de savoir que les choses progressent toujours) mais je me retrouve avec des milliers de lignes de journaux de console.

Est-il possible de faire un console.update qui efface/remplace une ligne de console plutôt que de créer une nouvelle ligne ?

1 votes

Pourquoi ne pas écrire dans un fichier journal que vous pouvez surveiller ou rechercher ?

3 votes

Je peux le faire assez facilement en PowerShell, mais le problème est que j'ai environ 5 000 lignes de console en cours d'écriture qui pourraient facilement prendre 10 lignes (la plupart sont juste des appels qui me permettent de savoir que les choses progressent, ce qui est important car l'application fonctionne pendant environ 20 minutes et j'ai besoin de savoir si les choses sont en train de se casser ou de continuer à fonctionner).

0 votes

Cela répond-il à votre question ? Comment effacer les caractères imprimés dans la console

191voto

michelek Points 598

Essayez de jouer avec les méthodes process.stdout à la place sur la console :

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

TypeScript : clearLine() prend -1, 0 ou 1 comme paramètre de direction avec les significations suivantes :

-1 : à gauche du curseur.
0 : la ligne entière.
1 - à droite du curseur

12 votes

TypeError : process.stdout.clearLine n'est pas une fonction. Impossible à exécuter dans webstorm si quelqu'un d'autre rencontre ce problème.

0 votes

@TrevorD mon approche à ce sujet était d'ajouter un webstorm=true dans les paramètres de l'application dans la configuration du nœud webstorm et vérifiez la présence de process.argv.find(x => x.startsWith('webstorm=true') en utilisant cette réponse

2 votes

@Luiz Eduardo Ne serait-il pas plus simple d'envelopper en if (process.stdout.clearLine) { process.stdout.clearLine() } ?

92voto

Bruno Peres Points 1205

En suivant la réponse de @michelek, vous pouvez utiliser une fonction un peu comme ceci :

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

1 votes

Lorsque je l'utilise avec une boucle for, il clignote. Y a-t-il un moyen de corriger cela ?

3 votes

Pour réparer le scintillement, se débarrasser de process.stdout.clearLine()

1 votes

J'ai réalisé qu'ajouter ceci à une grande boucle augmente le temps de calcul de façon drastique. Par exemple, je lance 100 millions d'essais aléatoires et je les assigne à des variables. Cela devrait prendre 3 secondes. Avec cette fonction, cela prend une minute.

35voto

naomik Points 10423

Bien sûr, vous pouvez le faire en utilisant un module que j'ai aidé à créer : fknsrs/jetty

Installer via

npm install jetty

Voici un exemple d'utilisation

// 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 n'est pas très utile lorsqu'il est utilisé seul. Il est beaucoup plus efficace lorsque vous construisez une certaine abstraction au-dessus de lui pour rendre vos appels Jetty moins verbeux.

6 votes

J'ai rejeté cette proposition en raison de la licence restrictive de ce paquet.

40 votes

C'est une norme BSD 3-clause licsense . C'est une très mauvaise raison pour un vote négatif, je pense.

14 votes

@mmmeff, si vous pensez qu'une licence BSD à 3 clauses est restrictive, je crains que vous ne mourriez en entendant parler des licences GPL et AGPL.

28voto

Bart Theeten Points 111

Il suffit d'utiliser \r pour terminer votre ligne :

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

Voici un exemple simple (horloge murale) :

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

2 votes

Cela fonctionne, mais si la ligne "modifiée" est plus courte que la ligne précédente, certains des anciens caractères resteront dans le terminal.

0 votes

C'est génial. Quelqu'un sait comment ça marche ?

5 votes

@RaphaelRafatpanah assez simple : \r signifie retour chariot. Après \r le curseur va au début de la ligne, donc la sortie précédente sera remplacée par la nouvelle.

16voto

SpliFF Points 21945

Pour écrire une ligne partielle.

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

Si le volume de production est le véritable problème, vous devrez probablement repenser votre méthode d'enregistrement. Vous pourriez utiliser un système de journalisation qui permet une journalisation sélective en cours d'exécution afin de limiter la production à ce dont vous avez besoin.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X