Winston: Winston 不会记录/解析从异常中捕获的错误

创建于 2020-03-04  ·  3评论  ·  资料来源: winstonjs/winston

请告诉我们您的环境:

  • _ winston版本?_ 3.2.1

    • [ ] winston@2

    • [x] winston@3

  • _ node -v输出:_ v12.8.1
  • _操作系统?_(Windows、macOS 或 Linux) Windows
  • _语言?_(所有 | TypeScript XX | ES6/7 | ES5 | Dart) ES6

问题是什么?

Winston 似乎没有记录异常,它似乎没有正确解析错误对象。

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
    transports: [
        new winston.transports.File({
            filename: `./logs/error-${momentLogger.unix()}.log`,
            level: 'error'
        }),
        new winston.transports.File({
            filename: `./logs/debug-${momentLogger.unix()}.log`,
            level: 'debug'
        }),
        new winston.transports.File({
            filename: `./logs/combined-${momentLogger.unix()}.log`
        }),
        new winston.transports.Console({
            format: winston.format.simple()
        })
    ]
});

try {
    logger.debug(folderIdRegex.exec(event.link)[1]);
} catch (ex) {
    console.log(ex); // Correctly prints
    logger.info(ex); // Undefined
    logger.debug(ex); // Undefined
    logger.error(ex); // Undefined
}

使用 VSCode 调试器进一步调试

// Output
TypeError: Cannot read property '1' of null
    at .....google-sheets-scraping-testing.js:188:51
    at processTicksAndRejections (internal/process/task_queues.js:85:5)
info: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}
error: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}

// Here I started using the built-in debug terminal
ex // Input into debug console
> TypeError: Cannot read property '1' of null // Result of ex
logger.log(ex) // Input into debug console
info: undefined {"timestamp":"2020-03-04T20:11:13.924Z"} // Result of logger.log(ex)
> DerivedLogger {_readableState: ReadableState, readable: true, _events: Object, _eventsCount: 3, _maxListeners: undefined, …}  // Result of logger.log(ex)

你期望发生什么?

我希望 Winston 记录从 try...catch 块中捕获的错误。 如果我改为传入ex.message而不是ex ,它会正确输出。 ex在整个 catch 块中都被定义了,但由于某种原因,Winston 似乎无法解析它。

其他信息

此外,如果我从 catch 块内return ex ,然后将所有内容包围在另一个 catch 块中,它似乎可以正确输出它。 有关这种不寻常行为的更多信息,请参阅我在 Discord 上发表的支持帖子

此外,我认为此错误还涉及另一个用户在过去一个月中遇到的问题 #1758

最有用的评论

我相信这可能是由于应用格式时 winston 记录器和传输之间的行为不一致。 在 winston-transport 中,TransportStream _write 函数的一部分执行以下操作:

transformed = this.format.transform(Object.assign({}, info), this.format.options);

winston/logger.js 中的相关代码看起来像这样:

this.push(this.format.transform(info, this.format.options));

这是该问题的简化重现。

const winston = require('winston');

// First logger uses a format configured on logger
const logger1 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console(),
  format: winston.format.simple()
});


// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console({
    format: winston.format.simple()
  })
});

logger1.info(new Error('err message'));   // logs expected 'err message'
logger2.info(new Error('err message'));   // logs 'undefined'

我不清楚应该首选哪种行为。

所有3条评论

我相信这可能是由于应用格式时 winston 记录器和传输之间的行为不一致。 在 winston-transport 中,TransportStream _write 函数的一部分执行以下操作:

transformed = this.format.transform(Object.assign({}, info), this.format.options);

winston/logger.js 中的相关代码看起来像这样:

this.push(this.format.transform(info, this.format.options));

这是该问题的简化重现。

const winston = require('winston');

// First logger uses a format configured on logger
const logger1 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console(),
  format: winston.format.simple()
});


// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console({
    format: winston.format.simple()
  })
});

logger1.info(new Error('err message'));   // logs expected 'err message'
logger2.info(new Error('err message'));   // logs 'undefined'

我不清楚应该首选哪种行为。

我想知道当 winston 没有正确记录某些对象并将其打印为[object Object]而其他对象打印没有问题时,这是否也是同样的情况

@jleverenz
谢谢,很棒的发现! 为我的问题提供了一个简单的解决方法,与https://github.com/winstonjs/winston/issues/1758相同

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jlank picture jlank  ·  4评论

greenhat616 picture greenhat616  ·  3评论

Tonacatecuhtli picture Tonacatecuhtli  ·  4评论

pocesar picture pocesar  ·  3评论

anks333 picture anks333  ·  3评论