我正在使用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,Node 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
在上述情况下,进程将退出,但不会创建日志文件。
5条答案
按热度按时间8qgya5xd1#
这个怎么样?
jv4diomz2#
最后,我找到了一个可行的解决方案。而不是监听
logger
finish
事件,它应该监听file._dest
finish
事件。但是file._dest
仅在file
open
事件之后创建。因此在初始化过程中需要等待file
open
事件。fcwjkofz3#
每个winston.Logger示例也是一个Node.js流。
当流结束后所有日志都刷新到所有传输时,将引发完成事件。
试着使用这个代码:
2jcobegt4#
answer from @WanChap很好,但在有多个文件传输的情况下就不行了。我将在下面发布我的整个日志解决方案,它可以正确处理退出流程,包括对开发和生产的支持。
唯一的警告是,它目前不适用于异常日志,但它将适用于所有其他基于传输的日志。如果有人知道如何使用异常日志,请在评论中发表。
首先,您希望在执行日志的文件所在的目录中创建一个文件夹,并将其命名为
logger
。在此文件夹中创建三个.js
文件,一个名为**dev-logger.js
,另一个名为prod-logger.js
,最后是index.js
**在node中,当你需要一个目录时,它会假设你要加载**
index.js
文件。**TheFileYouWantToLogFrom.js
index.js
该文件将查看节点进程环境状态并使用正确的日志记录器。
您可以稍后测试它,只需在终端中调用节点进程(在我的示例中是cron.js),比如说
NODE_ENV=production node cron.js
或NODE_ENV=development node cron.js
dev-logger.js
prod-logger.js
dev和prod logger文件的工作方式是使用
numOpenTransports
变量来跟踪当前打开的“文件传输”,一旦它们都关闭,* 然后 *,然后退出进程。n3schb8v5#
我尝试了下面的代码,但总是得到“TypeError:file.on不是函数”。我用的是Winston 3.9.0版本。