diff --git a/lib/layouts.js b/lib/layouts.js index 86dbfe1..259729c 100644 --- a/lib/layouts.js +++ b/lib/layouts.js @@ -30,7 +30,7 @@ const semver = require('semver'); function wrapErrorsWithInspect(items) { return items.map((item) => { - if ((item instanceof Error) && item.stack) { + if (util.isError(item) && item.stack) { return { inspect: function () { return semver.satisfies(process.version, '>=6') ? util.format(item) : `${util.format(item)}\n${item.stack}`; diff --git a/test/tap/stacktraces-test.js b/test/tap/stacktraces-test.js new file mode 100644 index 0000000..d5a1070 --- /dev/null +++ b/test/tap/stacktraces-test.js @@ -0,0 +1,31 @@ +'use strict'; + +const test = require('tap').test; + +test('Stacktraces from errors in different VM context', (t) => { + const log4js = require('../../lib/log4js'); + const recorder = require('../../lib/appenders/recording'); + const layout = require('../../lib/layouts').basicLayout; + const vm = require('vm'); + + log4js.configure({ + appenders: { vcr: { type: 'recording' } }, + categories: { default: { appenders: ['vcr'], level: 'debug' } } + }); + + const logger = log4js.getLogger(); + + try { + // Access not defined variable. + vm.runInNewContext('myVar();', {}, 'myfile.js'); + } catch (e) { + // Expect to have a stack trace printed. + logger.error(e); + } + + const events = recorder.replay(); + // recording appender events do not go through layouts, so let's do it + const output = layout(events[0]); + t.match(output, 'stacktraces-test.js'); + t.end(); +});