fix long-stack-trace error serialization added in 0.14.4
This commit is contained in:
parent
4ef6d4ded2
commit
e203c9fa56
4 changed files with 102 additions and 5 deletions
10
CHANGES.md
10
CHANGES.md
|
@ -2,7 +2,15 @@
|
||||||
|
|
||||||
## bunyan 0.14.5 (not yet released)
|
## bunyan 0.14.5 (not yet released)
|
||||||
|
|
||||||
(nothing yet)
|
- Fix a bug in the long-stack-trace error serialization added in 0.14.4. The
|
||||||
|
symptom:
|
||||||
|
|
||||||
|
bunyan@0.14.4: .../node_modules/bunyan/lib/bunyan.js:1002
|
||||||
|
var ret = ex.stack || ex.toString();
|
||||||
|
^
|
||||||
|
TypeError: Cannot read property 'stack' of undefined
|
||||||
|
at getFullErrorStack (.../node_modules/bunyan/lib/bunyan.js:1002:15)
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
## bunyan 0.14.4
|
## bunyan 0.14.4
|
||||||
|
|
|
@ -1000,8 +1000,12 @@ Logger.stdSerializers.res = function res(res) {
|
||||||
function getFullErrorStack(ex)
|
function getFullErrorStack(ex)
|
||||||
{
|
{
|
||||||
var ret = ex.stack || ex.toString();
|
var ret = ex.stack || ex.toString();
|
||||||
if (ex.cause && typeof(ex.cause) === 'function')
|
if (ex.cause && typeof(ex.cause) === 'function') {
|
||||||
ret += '\nCaused by: ' + getFullErrorStack(ex.cause());
|
var cex = ex.cause();
|
||||||
|
if (cex) {
|
||||||
|
ret += '\nCaused by: ' + getFullErrorStack(cex);
|
||||||
|
}
|
||||||
|
}
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,8 @@
|
||||||
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"tap": "0.2.0",
|
"tap": "0.2.0",
|
||||||
"ben": "0.0.0"
|
"ben": "0.0.0",
|
||||||
|
"verror": "1.3.3"
|
||||||
},
|
},
|
||||||
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
|
@ -5,9 +5,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var test = require('tap').test;
|
var test = require('tap').test;
|
||||||
var bunyan = require('../lib/bunyan');
|
|
||||||
var http = require('http');
|
var http = require('http');
|
||||||
|
|
||||||
|
var bunyan = require('../lib/bunyan');
|
||||||
|
var verror = require('verror');
|
||||||
|
|
||||||
|
|
||||||
function CapturingStream(recs) {
|
function CapturingStream(recs) {
|
||||||
this.recs = recs;
|
this.recs = recs;
|
||||||
|
@ -168,3 +170,85 @@ test('err serializer', function (t) {
|
||||||
t.equal(lastRecord.err.stack, theErr.stack);
|
t.equal(lastRecord.err.stack, theErr.stack);
|
||||||
t.end();
|
t.end();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test('err serializer: long stack', function (t) {
|
||||||
|
var records = [];
|
||||||
|
var log = bunyan.createLogger({
|
||||||
|
name: 'serializer-test',
|
||||||
|
streams: [{
|
||||||
|
stream: new CapturingStream(records),
|
||||||
|
type: 'raw'
|
||||||
|
}],
|
||||||
|
serializers: {
|
||||||
|
err: bunyan.stdSerializers.err
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var topErr, midErr, bottomErr;
|
||||||
|
|
||||||
|
// Just a VError.
|
||||||
|
topErr = new verror.VError('top err');
|
||||||
|
log.info(topErr, 'the error');
|
||||||
|
var lastRecord = records[records.length-1];
|
||||||
|
t.equal(lastRecord.err.message, topErr.message);
|
||||||
|
t.equal(lastRecord.err.name, topErr.name);
|
||||||
|
t.equal(lastRecord.err.stack, topErr.stack);
|
||||||
|
|
||||||
|
// Just a WError.
|
||||||
|
topErr = new verror.WError('top err');
|
||||||
|
log.info(topErr, 'the error');
|
||||||
|
var lastRecord = records[records.length-1];
|
||||||
|
t.equal(lastRecord.err.message, topErr.message);
|
||||||
|
t.equal(lastRecord.err.name, topErr.name);
|
||||||
|
t.equal(lastRecord.err.stack, topErr.stack);
|
||||||
|
|
||||||
|
// WError <- TypeError
|
||||||
|
bottomErr = new TypeError('bottom err');
|
||||||
|
topErr = new verror.WError(bottomErr, 'top err');
|
||||||
|
log.info(topErr, 'the error');
|
||||||
|
var lastRecord = records[records.length-1];
|
||||||
|
t.equal(lastRecord.err.message, topErr.message);
|
||||||
|
t.equal(lastRecord.err.name, topErr.name);
|
||||||
|
var expectedStack = topErr.stack + '\nCaused by: ' + bottomErr.stack;
|
||||||
|
t.equal(lastRecord.err.stack, expectedStack);
|
||||||
|
|
||||||
|
// WError <- WError
|
||||||
|
bottomErr = new verror.WError('bottom err');
|
||||||
|
topErr = new verror.WError(bottomErr, 'top err');
|
||||||
|
log.info(topErr, 'the error');
|
||||||
|
var lastRecord = records[records.length-1];
|
||||||
|
t.equal(lastRecord.err.message, topErr.message);
|
||||||
|
t.equal(lastRecord.err.name, topErr.name);
|
||||||
|
var expectedStack = topErr.stack + '\nCaused by: ' + bottomErr.stack;
|
||||||
|
t.equal(lastRecord.err.stack, expectedStack);
|
||||||
|
|
||||||
|
// WError <- WError <- TypeError
|
||||||
|
bottomErr = new TypeError('bottom err');
|
||||||
|
midErr = new verror.WError(bottomErr, 'mid err');
|
||||||
|
topErr = new verror.WError(midErr, 'top err');
|
||||||
|
log.info(topErr, 'the error');
|
||||||
|
var lastRecord = records[records.length-1];
|
||||||
|
t.equal(lastRecord.err.message, topErr.message);
|
||||||
|
t.equal(lastRecord.err.name, topErr.name);
|
||||||
|
var expectedStack = (topErr.stack
|
||||||
|
+ '\nCaused by: ' + midErr.stack
|
||||||
|
+ '\nCaused by: ' + bottomErr.stack);
|
||||||
|
t.equal(lastRecord.err.stack, expectedStack);
|
||||||
|
|
||||||
|
// WError <- WError <- WError
|
||||||
|
bottomErr = new verror.WError('bottom err');
|
||||||
|
midErr = new verror.WError(bottomErr, 'mid err');
|
||||||
|
topErr = new verror.WError(midErr, 'top err');
|
||||||
|
log.info(topErr, 'the error');
|
||||||
|
var lastRecord = records[records.length-1];
|
||||||
|
t.equal(lastRecord.err.message, topErr.message);
|
||||||
|
t.equal(lastRecord.err.name, topErr.name);
|
||||||
|
var expectedStack = (topErr.stack
|
||||||
|
+ '\nCaused by: ' + midErr.stack
|
||||||
|
+ '\nCaused by: ' + bottomErr.stack);
|
||||||
|
t.equal(lastRecord.err.stack, expectedStack);
|
||||||
|
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in a new issue