Skip to content

Instantly share code, notes, and snippets.

@mikesmullin
Created November 24, 2017 23:21
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mikesmullin/008721d4753d3e0d9a95cda617874736 to your computer and use it in GitHub Desktop.
Save mikesmullin/008721d4753d3e0d9a95cda617874736 to your computer and use it in GitHub Desktop.
Node.JS print filename and line number prefixed to console log output
const path = require('path');
function trace(s) {
const orig = Error.prepareStackTrace;
Error.prepareStackTrace = (_, stack) => stack;
const err = new Error();
Error.captureStackTrace(err, arguments.callee);
Error.prepareStackTrace = orig;
const callee = err.stack[0];
process.stdout.write(`${path.relative(process.cwd(), callee.getFileName())}:${callee.getLineNumber()}: ${s}\n`);
}
module.exports = trace;
trace("hey");
@mikesmullin
Copy link
Author

That is Error.prototype.stack[0].getFileName. It is not well-documented anywhere, and the whole of Error.prototype.stack is classified as non-standardized by MDN. It works for me, but if its not defined you should question whether you are using latest Node.JS version, and whether the code that generated the Error did it in an unconventional way. It will not work in any browser; this is server-side Javascript only.

see also:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/stack
https://nodejs.org/api/errors.html#errors_error_stack
https://stackoverflow.com/questions/11386492/accessing-line-number-in-v8-javascript-chrome-node-js

@alator21
Copy link

Reversing lines 8 and 9 works for me. Thank you.

@Ilshidur
Copy link

I have a workaround without using arguments.callee, which is now deprecated :

const orig = Error.prepareStackTrace;
Error.prepareStackTrace = (_, stack) => stack;
const err = new Error();
Error.captureStackTrace(err, global);
const callee = err.stack[1];
Error.prepareStackTrace = orig;

const callerFile = path.relative(process.cwd(), callee.getFileName());
const callerLine = callee.getLineNumber();

@juanMarinero
Copy link

KasparEtter customized console.log() thanks in part to ( "Inspired by" quoting him) code in this GitHub, so I think it's relevant to show its solution: https://stackoverflow.com/a/60305881/9391770
I find his solution amazing!

@jorgeoliveirasantos
Copy link

let x = new Error().stack.split("\n")[1];
console.log(x);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment