Node.js कंसोल.लॉग - क्या नई लाइन बनाने के बजाय लाइन को अपडेट करना संभव है?


83

मेरे node.jsएप्लिकेशन में बहुत सारे कंसोल लॉग हैं, जो मेरे लिए देखना महत्वपूर्ण है (यह काफी बड़ा ऐप है जो लंबे समय तक चलता है और मुझे यह जानना होगा कि चीजें अभी भी प्रगति कर रही हैं) लेकिन मैं हजारों लाइनों के साथ समाप्त हो रहा हूं कंसोल लॉग।

क्या console.updateनई लाइन बनाने के बजाय कंसोल लाइन को मिटाना / बदलना किसी तरह संभव है ?


1
एक लॉग फ़ाइल पर क्यों न लिखें जिसे आप देख सकते हैं या खोज सकते हैं?
नेल्सन

1
मैं PowerShell में इतनी आसानी से कर सकता हूं, लेकिन यह अधिक है कि मेरे पास कंसोल की लगभग 5,000 पंक्तियां लिखी जा रही हैं जो आसानी से 10 पंक्तियां ले सकती हैं (ज्यादातर यह सिर्फ कॉल है जो मुझे बताती हैं कि चीजें प्रगति कर रही हैं, जो महत्वपूर्ण है ऐप लगभग 20 मिनट तक चलता है और मुझे इस पर प्रतिक्रिया की आवश्यकता है कि क्या चीजें टूट रही हैं / अभी भी चल रही हैं)।
JVG

क्या इससे आपके सवाल का जवाब मिलता है? कंसोल में मुद्रित वर्णों को कैसे मिटाया जाए
वेक्स

जवाबों:


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=trueवेबस्टॉर्म नोड कॉन्फ़िगरेशन में एक आवेदन मापदंडों को जोड़ने और process.argv.find(x => x.startsWith('webstorm=true')इस उत्तर का उपयोग करने के लिए जाँच करना था
लुइज़ एडुआर्डो

1
@ लुइज़ एडुआर्डो क्या सिर्फ लपेटना सरल नहीं होगा 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

@ मिशेल के जवाब के बाद, आप कुछ इस तरह से एक समारोह का उपयोग कर सकते हैं:

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

1
लूप के लिए इसका उपयोग करते समय, यह टिमटिमा रहा है, क्या इसे ठीक करने का कोई तरीका है?
अंको मैं zle

1
झिलमिलाहट को ठीक करने के लिए,process.stdout.clearLine()
डिकोडर 7283

मैंने महसूस किया कि इसे एक बड़े लूप में जोड़ने से गणना का समय बहुत अधिक बढ़ जाता है। उदाहरण के लिए मैं 100mil रैंडम ट्राइ कर रहा हूं और वेरिएबल्स को असाइन कर रहा हूं। इसमें 3 सेकंड लगने चाहिए। इस समारोह के साथ। यह एक मिनट की तरह लगता है
Mj जमील

मेरी उक्त टिप्पणी पर कोई विचार न करें। मुझे लगता है कि सभी कंसोल लॉग की लागत बहुत अधिक है। चूँकि मैं प्रतिशत से प्रगति को प्रिंट करने की कोशिश कर रहा था, इसलिए मुझे एक फ़ंक्शन लिखना पड़ा जो केवल कुछ अंतरालों जैसे 1% 2% आदि पर प्रिंट करता है
एमजे जमील

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

जेट्टी सुपर उपयोगी नहीं है जब यह अपने आप में उपयोग किया जाता है। यह बहुत अधिक प्रभावी है जब आप इसके शीर्ष पर कुछ अमूर्त का निर्माण करते हैं ताकि आपके जेटी कम वर्बोज़ कॉल कर सकें।


3
मैंने इस पैकेज पर प्रतिबंधात्मक लाइसेंस के कारण इसे अस्वीकृत कर दिया।
mmmeff

17
यह एक मानक बीएसडी 3-क्लॉज लिकटेंस है । डाउन-वोट के लिए बहुत बुरा कारण, इमो।
धन्यवाद

6
@mmmeff, अगर आपको लगता है कि बीएसडी 3-क्लॉज़ लाइसेंस प्रतिबंधक है, तो मुझे डर है कि जीपीएल और एजीपीएल लाइसेंस के बारे में सुनकर आप मर जाएंगे।
माइकल Pfaff

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 functionदृश्य स्टूडियो कोड (या वेबस्टॉर्म) के डिबग कंसोल विंडो में जैसे स्टडआउट अपवाद देखते हैं , तो ऐप को आंतरिक कंसोल के बजाय बाहरी टर्मिनल एप्लिकेशन के रूप में चलाएं। इसका कारण यह है कि डिबग कंसोल विंडो TTY नहीं है ( process.stdout.isTTYगलत है)। इसलिए विकल्प के launch.jsonसाथ अपने लॉन्च कॉन्फ़िगरेशन को अपडेट करें "console": "externalTerminal"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.