Node.js में स्टैक ट्रेस कैसे प्रिंट करें?


जवाबों:


615

किसी भी Errorवस्तु में एक stackसदस्य होता है जो उस बिंदु पर फंस जाता है जिस पर इसका निर्माण किया गया था।

var stack = new Error().stack
console.log( stack )

या अधिक बस:

console.trace("Here I am!")

1
या बस sys.puts(new Error().stack)(सिस्टम मॉड्यूल को जोड़ने के बाद)
sirh

5
अब के रूप में, sys वंचित है। इसे बदल दिया जाता है 'util'
११:१५ बजे पिंडतजुह

12
+1 भी दिखाने के लिए new Error().stack, जो उन मामलों में काम करता है जहां आप कंसोल को शामिल नहीं करना चाहते हैं।
यूजीन बेरेसोव्स्की

1
इसका एक फायदा traceयह है कि यह वर्तमान लाइन / संदर्भ को दर्शाता है जो stackऐसा नहीं करता है। जानकारी त्रुटि ऑब्जेक्ट में है यदि आप मैन्युअल रूप से उस पंक्ति को बनाना चाहते हैं जो मुझे लगता है।
16

130
कंसोल.लॉग (इरेटास्टैक) और कंसोलट्रेस () आपको एक ही परिणाम नहीं देते हैं। जबकि इरेट.स्टैक आपको स्वयं गलत ऑब्जेक्ट के लिए स्टैक ट्रेस देता है (जिस तरह से हम सभी सामान्य रूप से अपवादों के बारे में सोचते हैं), कंसोल.ट्रेस () उस बिंदु पर कॉल स्टैक को प्रिंट करेगा जहां कंसोल.ट्रेस () कहा जा रहा है। इसलिए यदि आप कोड की कुछ गहरी परत द्वारा फेंकी जा रही कुछ त्रुटि को पकड़ते हैं, तो कंसोल ।्रेस () में स्टैक ट्रेस में वह गहरी परत कोड नहीं होगी क्योंकि वह कोड स्टैक पर नहीं है। हालाँकि, कंसोल.लॉग (इरेटास्टैक) में तब तक गहरी परतें होंगी, जब तक कि यह एक एरर ऑब्जेक्ट फेंक देता है।
d512

200

अब इसके लिए कंसोल पर एक समर्पित कार्य है:

console.trace()

11
बस उपरोक्त टिप्पणी के बारे में सुनिश्चित करें console.trace()
Qix - मोनासा 23

5
डिफ़ॉल्ट रूप से यह केवल 10 फ्रेम दिखाएगा, आप इसे बढ़ाने के लिए कमांड-लाइन तर्क का उपयोग कर सकते हैं, जैसे--stack_trace_limit=200
माइकल

यदि आप लॉग फ़ाइल में आउटपुट करना चाहते हैं तो क्या होगा?
हां।

यह वादे और async / इंतजार के साथ काम करने के लिए प्रतीत नहीं होता है, यह करता है?
bluenote10

96

जैसा कि पहले ही उत्तर दिया गया है, आप केवल ट्रेस कमांड का उपयोग कर सकते हैं :

console.trace("I am here");

हालाँकि, यदि आप इस प्रश्न पर आते हैं कि किसी अपवाद के स्टैक ट्रेस को कैसे लॉग किया जाए , तो आप केवल अपवाद ऑब्जेक्ट को लॉग इन कर सकते हैं।

try {  
  // if something unexpected
  throw new Error("Something unexpected has occurred.");     

} catch (e) {
  console.error(e);
}

यह लॉग करेगा:

त्रुटि: कुछ अप्रत्याशित हुआ है।
    मुख्य (c: \ Users \ Me \ Documents \ MyApp \ app.js: 9: 15)
    ऑब्जेक्ट पर। (c: \ Users \ Me \ Documents \ MyApp \ app.js: 17: 1)
    Module._compile (मॉड्यूल.js: 460: 26)
    पर Object.Module._extensions..js (मॉड्यूल.js: 478: 10) )
    पर Module.load (module.js: 355: 32)
    Function.Module._load (module.js पर: 310: 12)
    Function.Module.runMain (module.js पर: 501: 10)
    स्टार्टअप (Node.js पर : 129: 16)
    नोड.जेएस पर: 814: 3


यदि आपका Node.js संस्करण 6.0.0 से अधिक है , तो एक्सेप्शन ऑब्जेक्ट को लॉग करना पर्याप्त नहीं होगा। इस मामले में, यह केवल प्रिंट करेगा:

[त्रुटि: कुछ अप्रत्याशित हुआ है।]

नोड संस्करण <6 के लिए, त्रुटि संदेश प्रिंट करने के console.error(e.stack)बजाय console.error(e)पूर्ण स्टैक का उपयोग करें, जैसे वर्तमान नोड संस्करण करता है।


नोट: यदि अपवाद को स्ट्रिंग के रूप में बनाया जाता है throw "myException", तो स्टैक ट्रेस और लॉगिंग e.stackपैदावार को अपरिभाषित करना संभव नहीं है ।

सुरक्षित होने के लिए, आप उपयोग कर सकते हैं

console.error(e.stack || e);

और यह पुराने और नए Node.js संस्करणों के लिए काम करेगा।


ऑब्जेक्ट में सब कुछconsole.error(e) प्रिंट नहीं होगा , सहित ? ee.stack
ड्राम्ब्रेवेर

1
@drmrbrewer, इसे इंगित करने के लिए धन्यवाद। ऐसा लगता है कि नोड संस्करणों 4.x और 7.x (शायद एक V8 परिवर्तन) के बीच व्यवहार बदल गया है। मैंने अपना उत्तर अपडेट कर दिया है।
ज़ानोन

1
@drmrbrewer ने पुष्टि की कि यह व्यवहार संस्करण 6.0.0
ज़नॉन

2
क्षमा करें, मैंने अभी कुछ महत्वपूर्ण खोज की है। संबंधित पोस्ट के खिलाफ मेरी टिप्पणी देखें: stackoverflow.com/questions/42528677/… । ऐसा लगता है कि त्रुटि को अपने आप में लॉग करना वास्तव में त्रुटि की पूरी सामग्री को दिखाता है, लेकिन अन्य पाठ के साथ इसे (स्ट्रिंग की तरह) संक्षिप्त करने की कोशिश करने से केवल संक्षिप्त संदेश भाग का उपयोग किया जाएगा। यह सब उस अहसास के साथ बहुत अधिक समझ में आता है।
ड्राम्ब्रेवर

1
तुम मेरा दिन बचाओ)
एलेक्स

39

Errorकंसोल के स्टैकट्रेस को अधिक पठनीय तरीके से प्रिंट करने के लिए:

console.log(ex, ex.stack.split("\n"));

उदाहरण परिणाम:

[Error] [ 'Error',
  '    at repl:1:7',
  '    at REPLServer.self.eval (repl.js:110:21)',
  '    at Interface.<anonymous> (repl.js:239:12)',
  '    at Interface.EventEmitter.emit (events.js:95:17)',
  '    at Interface._onLine (readline.js:202:10)',
  '    at Interface._line (readline.js:531:8)',
  '    at Interface._ttyWrite (readline.js:760:14)',
  '    at ReadStream.onkeypress (readline.js:99:10)',
  '    at ReadStream.EventEmitter.emit (events.js:98:17)',
  '    at emitKey (readline.js:1095:12)' ]

9

आसानी से उपलब्ध नोड मॉड्यूल के साथ, नोड से पूर्ण-लंबाई स्टैक निशान प्राप्त करना संभव है (मामूली प्रदर्शन दंड के साथ यद्यपि): http://www.mattinsler.com/post/26396305882/announcing-longnohn-long-stack -traces के लिए नोड js


4
मृत लिंक करें, लेकिन यहां संग्रहित प्रति को नष्ट कर सकते हैं या लाइब्रेरी की जांच कर सकते हैं ।
कोडबेलिंग

5

Error.captureStackTrace (targetObject [, constructorOpt]) की कोशिश करें ।

const myObj = {};
function c() {
  // pass
}

function b() {
    Error.captureStackTrace(myObj)
    c()
} 

function a() {
    b()
}

a()

console.log(myObj.stack)

फ़ंक्शन aऔर bत्रुटि स्टैक में कैप्चर किए जाते हैं और संग्रहीत होते हैं myObj


2
यदि आप एक stackसंपत्ति चाहते हैं, तो आपको इसे कॉल करना होगा यदि Node> = 6 Error.captureStackTrace(error):।
cjbarth

ध्यान दें कि यदि आप उस फ़्रेम को नहीं चाहते हैं जिसे Error.captureStackTraceस्टैक ट्रेस में दिखाने के लिए बुलाया गया है, तो आप इसे constructorOptआर्ग के रूप में पास करके इसे छोड़ सकते हैं ।
उल्लौरी

3

मैं जानता हूं कि नोडज में पूर्ण स्टैक ट्रेस को प्रिंट करना संभव नहीं है, आप बस एक "आंशिक" स्टैक ट्रेस को प्रिंट कर सकते हैं, आप यह नहीं देख सकते हैं कि आप कोड में कहां से आए थे, बस जहां अपवाद होता है। यही रयान डाहल इस यूट्यूब वीडियो में बताते हैं। http://youtu.be/jo_B4LTHi3I सटीक होने के लिए न्यूनतम 56:30 मिनट। उम्मीद है की यह मदद करेगा


2
सच है, लेकिन @ टिम्बौद्रेउ के जवाब में मॉड्यूल "फिक्स" है कि
बोगदान डी

3

@ आइसाक्स का उत्तर सही है, लेकिन यदि आपको अधिक विशिष्ट या क्लीनर त्रुटि स्टैक की आवश्यकता है , तो आप इस फ़ंक्शन का उपयोग कर सकते हैं:

function getCleanerStack() {
   var err = new Error();
   Error.captureStackTrace(err, getStack);

   return err.stack;
}

यह फ़ंक्शन सीधे फ़ंक्शन से प्रेरित console.traceहै NodeJS

स्रोत कोड: हाल का संस्करण या पुराना संस्करण


1
यह काम नहीं करता है, केवल वर्तमान लाइन से स्टैक दिखाते हैं (यह त्रुटि उत्पन्न लाइन नहीं)। err.stackअधिक सही उत्तर है।
इयान झोंग

2

यदि आप केवल त्रुटि के स्टैक ट्रेस लॉग करना चाहते हैं (और त्रुटि संदेश नहीं) नोड 6 और इसके बाद के संस्करण में स्वचालित रूप से स्टैक ट्रेस के अंदर त्रुटि नाम और संदेश शामिल है, जो कि कुछ कस्टम त्रुटि हैंडलिंग करना चाहते हैं तो थोड़ा कष्टप्रद है:

console.log(error.stack.replace(error.message, ''))

यह समाधान केवल त्रुटि नाम और स्टैक ट्रेस लॉग करेगा (इसलिए आप उदाहरण के लिए, त्रुटि संदेश को प्रारूपित कर सकते हैं और इसे प्रदर्शित कर सकते हैं कि आप अपने कोड में कहीं और कैसे चाहते हैं)।

उपरोक्त उदाहरण, स्टैक ट्रेस द्वारा केवल त्रुटि नाम का अनुसरण करेगा, उदाहरण के लिए:

Error: 
    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

के बजाय:

Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.

Did you mean this?
        rev-list

    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

1

मामले में कोई अभी भी इस तरह की तलाश में है जैसे मैं था, तो एक मॉड्यूल है जिसे हम "स्टैक-ट्रेस" नामक उपयोग कर सकते हैं। यह वास्तव में लोकप्रिय है।एनपीएम लिंक

फिर ट्रेस के माध्यम से चलो।

  var stackTrace = require('stack-trace');
  .
  .
  .
  var trace = stackTrace.get();
  trace.map(function (item){ 
    console.log(new Date().toUTCString() + ' : ' +  item.toString() );  
  });

या बस ट्रेस प्रिंट करें:

var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();

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