在nodejs中获取整个错误堆栈跟踪
getting the entire error stacktrace in nodejs
我的 SQLite 查询遵循一个简单的 try … catch
模式
try {
… run query and get result …
}
catch (error) {
console.log(error);
}
出错时,我得到一个像这样的漂亮堆栈跟踪
SqliteError: no such column:
at getData (/Users/punkish/Projects/zenodeo/bin/facets.js:8:25)
at Object.<anonymous> (/Users/punkish/Projects/zenodeo/bin/facets.js:23:1)
at Module._compile (internal/modules/cjs/loader.js:1156:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1176:10)
at Module.load (internal/modules/cjs/loader.js:1000:32)
at Function.Module._load (internal/modules/cjs/loader.js:899:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
at internal/main/run_main_module.js:18:47
我已经编写了自己的小型日志记录例程,因此我可以用颜色(使用 chalk
)和一些我认为有用的额外信息来修饰消息,现在我有
try {
… run query and get result …
}
catch (error) {
mylogger(error);
}
除此之外,现在我只得到以下内容
SqliteError: no such column:
不,mylogger
并没有 eating/chopping 去掉多余的位。我添加了以下内容
if (typeof error === 'object') {
log('type: object');
log(`error: ${JSON.stringify(error)}`)
}
然后我得到
type: object
error: SqliteError: no such column:
似乎堆栈跟踪正在流式传输,但所有这些都没有转到 mylogger
。无论如何,我怎样才能得到所有这些?
我用的是Winston,之前遇到过同样的问题。我使用 .constructor
而不是 instanceOf
来确定可能是最佳做法的数据类型。但是我这里的代码可能对你有一些价值:
winston.format.printf(info => {
if (info.message.constructor === Object || Error) {
if (info.stack === undefined) {
return `${info.timestamp} [${info.label}] ${info.level}: ${JSON.stringify(info.message, null, 1)}`;
} else {
return `${info.timestamp} [${info.label}] ${info.level}: ${info.message} Stack: ${info.stack}`;
}
} else {
return `${info.timestamp} [${info.label}] ${info.level}: ${info.message}`;
}
})
);
我的 SQLite 查询遵循一个简单的 try … catch
模式
try {
… run query and get result …
}
catch (error) {
console.log(error);
}
出错时,我得到一个像这样的漂亮堆栈跟踪
SqliteError: no such column:
at getData (/Users/punkish/Projects/zenodeo/bin/facets.js:8:25)
at Object.<anonymous> (/Users/punkish/Projects/zenodeo/bin/facets.js:23:1)
at Module._compile (internal/modules/cjs/loader.js:1156:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1176:10)
at Module.load (internal/modules/cjs/loader.js:1000:32)
at Function.Module._load (internal/modules/cjs/loader.js:899:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
at internal/main/run_main_module.js:18:47
我已经编写了自己的小型日志记录例程,因此我可以用颜色(使用 chalk
)和一些我认为有用的额外信息来修饰消息,现在我有
try {
… run query and get result …
}
catch (error) {
mylogger(error);
}
除此之外,现在我只得到以下内容
SqliteError: no such column:
不,mylogger
并没有 eating/chopping 去掉多余的位。我添加了以下内容
if (typeof error === 'object') {
log('type: object');
log(`error: ${JSON.stringify(error)}`)
}
然后我得到
type: object
error: SqliteError: no such column:
似乎堆栈跟踪正在流式传输,但所有这些都没有转到 mylogger
。无论如何,我怎样才能得到所有这些?
我用的是Winston,之前遇到过同样的问题。我使用 .constructor
而不是 instanceOf
来确定可能是最佳做法的数据类型。但是我这里的代码可能对你有一些价值:
winston.format.printf(info => {
if (info.message.constructor === Object || Error) {
if (info.stack === undefined) {
return `${info.timestamp} [${info.label}] ${info.level}: ${JSON.stringify(info.message, null, 1)}`;
} else {
return `${info.timestamp} [${info.label}] ${info.level}: ${info.message} Stack: ${info.stack}`;
}
} else {
return `${info.timestamp} [${info.label}] ${info.level}: ${info.message}`;
}
})
);