我正在使用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
在上述情况下,该过程将退出,但不会创建日志文件。
答案 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