如何在进程退出之前强制将Node.js Winston日志记录到文件

时间:2019-11-19 12:07:32

标签: node.js winston

我正在使用winston 3记录我的数据。但有时它并没有在进程退出前记录错误。

以下过程将退出,而不登录到logfile.log

const winston = require('winston');

winston.add(new winston.transports.File({
    filename: 'logfile.log'
}));

winston.info('please log me in');
process.exit(1);

尝试使用的解决方案之一是使用回调:

const winston = require('winston');

const logger = new winston.createLogger({
    new winston.transports.File({
    filename: 'logfile.log'
}));

winston.info('please log me in', () => {
    process.exit(1);
});

setTimeout(() => {}, 100000000000); // pause the process until process.exit is call

但是Winston 3.x具有callback issue,因此上述代码无法正常工作,该过程将不会退出。

我正在寻找可行的解决方案?任何帮助将不胜感激。我的操作系统是 Ubuntu 16.04 节点10.17

修改1: 我也尝试了Prabhjot Singh Kainth的建议使用finish事件来触发进程退出:

const winston = require('winston');

const logger = winston.createLogger({
    transports: [
        new winston.transports.File({
            filename: 'logfile.log'
        })
    ]
});

logger.info('please log me in');

logger.on('finish', () => {
    process.exit();
});
logger.end();

setTimeout(() => {}, 100000000000); // pause the process until process.exit is call

在上述情况下,该过程将退出,但不会创建日志文件。

3 个答案:

答案 0 :(得分:3)

这个怎么样?

logger.info('First message...')
logger.info('Last message', () => process.exit(1))

答案 1 :(得分:0)

winston.Logger的每个实例也是Node.js流。

当流结束后,所有日志都已刷新到所有传输时,将引发完成事件。

只需尝试使用以下代码:

const transport = new winston.transports.Console();
const logger = winston.createLogger({
  transports: [transport]
});
logger.on('finish', function (info) {
  // All `info` log messages has now been logged
});

logger.info('CHILL WINSTON!', { seriously: true });
logger.end();

答案 2 :(得分:0)

最后,我找到了一个可行的解决方案。与其监听logger finish事件,不如监听file._dest finish事件。但是file._dest仅在file open事件之后创建。因此,它需要在初始化过程中等待file open事件。

const winston = require('winston');

const file = new winston.transports.File({
  filename: 'logfile.log'
});

const logger = winston.createLogger({
    transports: [file]
});

file.on('open', () => {  // wait until file._dest is ready
  logger.info('please log me in');
  logger.error('logging error message');
  logger.warn('logging warning message');

  file._dest.on('finish', () => {
    process.exit();
  });
  logger.end();
});

setTimeout(() => {}, 100000000000); // pause the process until process.exit is call