Node.js에서 스택 추적을 인쇄하는 방법은 무엇입니까?


답변:


615

모든 Error객체에는 객체가 구성된 stack지점을 트랩 하는 멤버가 있습니다.

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

또는 더 간단하게 :

console.trace("Here I am!")

1
또는 sys.puts(new Error().stack)(시스템 모듈을 추가 한 후)
sirhc

5
현재로서는 sys가 지원되지 않습니다. 로 교체되었습니다 'util'.
Pindatjuh

12
또한 +1을 표시 new Error().stack하면 콘솔을 사용하지 않으려는 경우에 작동합니다.
Eugene Beresovsky

1
한 가지 장점은 trace현재 줄 / 문맥을 보여 주지만 stack그렇지 않은 것입니다. 내가 추측하는 줄을 수동으로 만들려면 정보가 오류 개체에 있습니다.
studgeek

130
console.log (err.stack) 및 console.trace ()는 동일한 결과를 제공하지 않습니다. err.stack은 err 객체 자체에 대한 스택 추적 (일반적으로 예외를 생각하는 방식으로 작동)을 제공하지만 console.trace ()는 console.trace ()가 호출되는 지점에서 호출 스택을 인쇄합니다. 따라서 더 깊은 코드 레이어에 의해 오류가 발생하면 console.trace ()는 해당 코드가 더 이상 스택에 없기 때문에 스택 추적에 더 깊은 레이어 코드를 포함하지 않습니다. 그러나 console.log (err.stack)는 Error 객체를 던지는 한 더 깊은 레이어를 포함합니다.
d512


97

이미 답변했듯이 간단히 trace 명령을 사용할 수 있습니다 .

console.trace("I am here");

그러나 예외의 스택 추적을 로그하는 방법에 대해이 질문을한다면 Exception 객체를 간단히 기록 할 수 있습니다.

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)
    에서 Object.     Object.Module._extensions..js (module.js : 478 : 10 )
    의 Module._compile (module.js : 460 : 26)의 (c : \ Users \ Me \ Documents \ MyApp \ app.js : 17 : 1)
)     시작시 (node.js     ) Function.Module.runMain (module.js : 501 : 10)의     Function.Module._load (module.js : 310 : 12)의
    Module.load (module.js : 355 : 32) : 129 : 16)     node.js : 814 : 3에서




Node.js 버전이 6.0.0보다 작은 경우 Exception 객체를 로깅하는 것으로 충분하지 않습니다. 이 경우 인쇄 만됩니다.

[오류 : 예기치 않은 문제가 발생했습니다.]

Node 버전 <6의 경우 현재 Node 버전과 마찬가지로 오류 메시지와 전체 스택을 인쇄하는 console.error(e.stack)대신 대신 사용 console.error(e)하십시오.


참고 : 예외가와 같은 문자열로 생성 throw "myException"되면 스택 추적을 검색 할 수 없으며 로깅 e.stackundefined를 생성 합니다.

안전을 위해 사용할 수 있습니다

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

이전 및 새로운 Node.js 버전에서 작동합니다.


?를 포함 하여 객체의 모든 것을console.error(e) 인쇄 하지 않습니다 . ee.stack
drmrbrewer

1
@ drmrbrewer, 이것을 지적 해 주셔서 감사합니다. 노드 버전 4.x와 7.x 사이에서 동작이 변경된 것 같습니다 (아마도 V8 변경). 내 답변을 업데이트했습니다.
Zanon

1
@drmrbrewer는이 동작이 버전 6.0.0
Zanon

2
미안하지만 중요한 것을 발견했습니다. 관련 게시물에 대한 내 의견을 참조하십시오 : stackoverflow.com/questions/42528677/… . 오류를 자체적으로 기록하면 실제로 오류의 전체 내용이 표시되지만 (문자열과 같이) 다른 텍스트와 연결하려고하면 간단한 메시지 부분 만 사용됩니다. 그것은 모두 그 실현에 훨씬 더 합리적입니다.
drmrbrewer

1
당신은 내 하루를 저장)
Alex

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)' ]


5

Error.captureStackTrace (targetObject [, constructorOpt]) 시도하십시오 .

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

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

function a() {
    b()
}

a()

console.log(myObj.stack)

함수 ab에러 스택에서 캡처되고 저장된다 myObj.


2
오류가 stack속성 을 가지려면 Node> = 6 : 인 경우이를 호출해야합니다 Error.captureStackTrace(error).
cjbarth

호출 한 프레임을 Error.captureStackTrace스택 추적에 표시 하지 않으려면 constructorOptarg 로 전달 하여 해당 프레임을 생략 할 수 있습니다 .
울라 우리

3

내가 알고있는 nodejs에서 전체 스택 추적을 인쇄하는 것은 불가능합니다. "부분"스택 추적을 인쇄 할 수 있습니다. 코드에서 어디에서 왔는지, 예외가 발생하는 곳에서 볼 수는 없습니다. Ryan Dahl이이 YouTube 비디오에서 설명합니다. 정확성을 위해 최소 56:30의 http://youtu.be/jo_B4LTHi3I 도움이 되었기를 바랍니다


2
Timboudreau의 대답은 "수정"그 @의 사실,하지만 모듈
보그 D

3

@isaacs 답변은 정확하지만 더 구체적이거나 명확한 오류 스택 이 필요한 경우이 기능을 사용할 수 있습니다.

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

   return err.stack;
}

이 함수는 NodeJSconsole.trace함수에서 직접 영감을 얻었습니다 .

소스 코드 : 최근 버전 또는 이전 버전 .


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

누군가 내가 여전히 그렇듯이 이것을 찾고 있다면 "stack-trace"라는 모듈이 있습니다. 정말 인기가 있습니다. NPM 링크

그런 다음 추적을 걷습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.