如何刷新温斯顿日志?

我想 process.exit 之前刷新winstonlogging器。

 process.on('uncaughtException', function(err){ logger.error('Fatal uncaught exception crashed cluster', err); logger.flush(function(){ // <- process.exit(1); }); }); 

有没有什么像logger.flush可用? 我找不到任何关于它的事情,除了抱怨温斯顿没有被非常积极地维护的人之外。

作为替代scheme,是否有任何stream行的(主动维护的)多传输日志框架提供了冲洗function?

温斯顿实际上允许你传递一个callback,当所有的传输都被logging时执行:

 process.on('uncaughtException', function(err) { logger.log('error', 'Fatal uncaught exception crashed cluster', err, function(err, level, msg, meta) { process.exit(1); }); }); 

文档: https : //github.com/flatiron/winston#events-and-callbacks-in-winston

在像Thomas Heymannbuild议的日志callback中调用process.exit不能确保日志实际上被刷新,特别是在使用File -transport时。

而不是直接调用process.exit,我会让logging器在日志刷新后调用process.exit

logger.js:

 var winston = require('winston'); winston.loggers.add('my-logger', { console: { level: 'debug', colorize: true, timestamp: true, handleExceptions: true }, file: { level: 'info', colorize: false, timestamp: true, filename: file, handleExceptions: true } }); var logger = winston.loggers.get('my-logger'); /* ******* * * EXPORTS * ******* */ exports.exitAfterFlush = function(code) { logger.transports.file.on('flush', function() { process.exit(code); }); }; exports.info = function() { logger.info.apply(this, arguments); }; exports.warn = function() { logger.info.apply(this, arguments); }; exports.error = function() { logger.info.apply(this, arguments); }; 

在你的代码中:

 var logger = require('./logger.js'); logger.exitAfterFlush(0); info('Done!'); 

在NodeJS v4.1.2和winston 1.1.0上testing

不幸的是,温斯顿有时会在传输有机会刷新之前调用日志loggingcallback,因此接受的答案仍然会导致未保存的日志消息(特别是在事件循环的第一个回合中)。 在winston-log-and-exit软件包/补丁程序中实现了一个更好的解决scheme。

温斯顿有一个更好的办法来处理这个例外。

 var logger = new (winston.Logger)({ transports: [ new winston.transports.File({ filename: 'path/to/all-logs.log' }) ], handleExceptions: true, exceptionHandlers: [ new winston.transports.File({ filename: 'path/to/exceptions.log' }) ] });