node.js - 为什么 Winston 记录器会删除错误详细信息
问题描述
我试图记录 axios 错误,所以我定义了一个自定义错误并使用 Winston.error 记录。但是,没有显示响应详细信息。奇怪的是,console.log 打印了所有细节。
使用console.log,我得到了这个。
{ MyError:
at new MyError (src/axios-test.ts:16:15)
at src/axios-test.ts:29:15
at Generator.throw (<anonymous>)
at rejected (/src/axios-test.ts:6:65)
at process._tickCallback (internal/process/next_tick.js:68:7)
name: 'MyError',
myerror:
{ Error: Request failed with status code 500
at createError (/Users/woonggeunjang/dev/node_modules/axios/lib/core/createError.js:16:15)
at settle (/Users/dev/node_modules/axios/lib/core/settle.js:17:12)
at IncomingMessage.handleStreamEnd (/Users/dev/node_modules/axios/lib/adapters/http.js:236:11)
at IncomingMessage.emit (events.js:203:15)
at IncomingMessage.EventEmitter.emit (domain.js:448:20)
at endReadableNT (_stream_readable.js:1145:12)
at process._tickCallback (internal/process/next_tick.js:63:19)
config:
{ url: 'https://ptsv2.com/t/gcnad-1585724700/post',
method: 'post',
data: 'hmm',
headers: [Object],
transformRequest: [Array],
transformResponse: [Array],
timeout: 0,
adapter: [Function: httpAdapter],
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
validateStatus: [Function: validateStatus] },
request:
ClientRequest {
domain: null,
_events: [Object],
_eventsCount: 6,
_maxListeners: undefined,
output: [],
outputEncodings: [],
outputCallbacks: [],
outputSize: 0,
writable: true,
_last: true,
chunkedEncoding: false,
shouldKeepAlive: false,
useChunkedEncodingByDefault: true,
sendDate: false,
_removedConnection: false,
_removedContLen: false,
_removedTE: false,
_contentLength: null,
_hasBody: true,
_trailer: '',
finished: true,
_headerSent: true,
socket: [TLSSocket],
connection: [TLSSocket],
_header:
'POST /t/gcnad-1585724700/post HTTP/1.1\r\nAccept: application/json, text/plain, */*\r\nContent-Type: application/x-www-form-urlencoded\r\nUser-Agent: axios/0.19.2\r\nContent-Length: 3\r\nHost: ptsv2.com\r\nConnection: close\r\n\r\n',
_onPendingData: [Function: noopPendingOutput],
agent: [Agent],
socketPath: undefined,
timeout: undefined,
method: 'POST',
path: '/t/gcnad-1585724700/post',
_ended: true,
res: [IncomingMessage],
aborted: undefined,
timeoutCb: null,
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
_redirectable: [Writable],
[Symbol(isCorked)]: false,
[Symbol(outHeadersKey)]: [Object] },
response:
{ status: 500,
statusText: 'Internal Server Error',
headers: [Object],
config: [Object],
request: [ClientRequest],
data: 'Thank you for this dump. I hope you have a lovely day!' },
isAxiosError: true,
toJSON: [Function] } }
至于 Winston.error(),我得到了这个
{"name":"MyError","myerror":{"message":"Request failed with status code 500","name":"Error","stack":"Error: Request failed with status code 500\n at createError (/Users/woonggeunjang/dev/onda-cms/node_modules/axios/lib/core/createError.js:16:15)\n at settle (/Users/woonggeunjang/dev/onda-cms/node_modules/axios/lib/core/settle.js:17:12)\n at IncomingMessage.handleStreamEnd (/Users/woonggeunjang/dev/onda-cms/node_modules/axios/lib/adapters/http.js:236:11)\n at IncomingMessage.emit (events.js:203:15)\n at IncomingMessage.EventEmitter.emit (domain.js:448:20)\n at endReadableNT (_stream_readable.js:1145:12)\n at process._tickCallback (internal/process/next_tick.js:63:19)","config":{"url":"https://ptsv2.com/t/gcnad-1585724700/post","method":"post","data":"hmm","headers":{"Accept":"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","User-Agent":"axios/0.19.2","Content-Length":3},"transformRequest":[null],"transformResponse":[null],"timeout":0,"xsrfCookieName":"XSRF-TOKEN","xsrfHeaderName":"X-XSRF-TOKEN","maxContentLength":-1}},"level":"error","message":"mm","stack":"MyError: \n at new MyError (/Users/woonggeunjang/dev/onda-cms/src/axios-test.ts:16:15)\n at /Users/woonggeunjang/dev/onda-cms/src/axios-test.ts:29:15\n at Generator.throw (<anonymous>)\n at rejected (/Users/woonggeunjang/dev/onda-cms/src/axios-test.ts:6:65)\n at process._tickCallback (internal/process/next_tick.js:68:7)","timestamp":"2020-04-01T12:43:45.530Z"}
这是我的代码
export default class MyError extends Error {
myerror: string;
constructor(error: string) {
super();
Object.setPrototypeOf(this, new.target.prototype);
this.name = 'MyError';
this.myerror = error;
Error.captureStackTrace(this);
}
}
async function testPost () {
let res = null;
try {
res = await axios.post('https://ptsv2.com/t/gcnad-1585724700/post', 'hmm');
} catch (error) {
// throw new Error(error);
// console.log(error);
// Logger.error('hmm', error.stack);
throw(new MyError(error));
}
}
testPost().catch(error => {
// console.log(error);
Logger.error('mm', error );
});
使用winston时似乎应用了一些格式。如果我设置 prettyPrint 格式,则会显示错误详细信息。
更新这是我的温斯顿配置
const consoleTransport = new transports.Console();
const Logger = createLogger({
transports: [consoleTransport],
format: format.combine(
format.timestamp(),
format.json(),
),
});
提前致谢。
解决方案
推荐阅读
- php - 如何在 PHP 中修复“未捕获的错误:调用未定义的方法”
- angular - 如何在工作表 JS 中设置列格式
- angular - 在 ng2-charts 中自定义图例形状
- jquery - 第一次未选中单选按钮
- json - Gatsby:在页面上组合两个 graphql 源(.json 和 .jpg 源)
- python - 如何在安装后脚本中访问安装目录?
- javascript - 如何解决空 ts 类型检查的问题?
- azure - 如何获取与函数应用关联的 Azure 虚拟网络本地 IP
- java - 我无法使用 IEDriver 在 IE11 Windows 10 中找到 xpath
- pandas - 使用带有 pandas groupby 的自定义评分函数在另一个数据框中创建列