首页 > 解决方案 > 为什么 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(),
    ),
});

提前致谢。

标签: node.jstypescriptconsole.logwinston

解决方案


推荐阅读