我想在 process.exit
之前刷新winston记录器。
process.on('uncaughtException', function(err){
logger.error('Fatal uncaught exception crashed cluster', err);
logger.flush(function(){ // <-
process.exit(1);
});
});
有logger.flush
可用吗?除了人们抱怨温斯顿没有得到很积极的维护之外,我找不到任何关于它的信息。
作为替代方案,是否有任何流行的(主动维护的)多传输日志框架提供刷新功能?
答案 0 :(得分:10)
Winston实际上允许您传入一个回调,该回调在记录所有传输时执行:
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
答案 1 :(得分:1)
在Thomas Heymann建议的日志回调中调用process.exit
将无法确保日志实际被刷新,尤其是在使用File
- 传输时。
我不会直接调用process.exit,而是在刷新日志后让记录器调用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上测试
答案 2 :(得分:1)
不幸的是,Winston有时会在传输有机会刷新之前调用日志回调,因此接受的答案仍然可能导致未保存的日志消息(特别是在事件循环的第一个转弯处)。在winston-log-and-exit包/补丁中实现了更好的解决方案。
答案 3 :(得分:1)
这可能会帮助某人。 logger是winston.createLogger的一个实例,它定义了两种传输方式(控制台和文件)。退出代码反映在外壳中。
const logger = require('../library/log');
function exitAfterFlush() {
logger.on('finish', function () {
logger.end();
});
};
process.on('exit', (code) => {
console.log(`About to exit with code: ${code}`);
});
logger.info(`Started with PID:${process.pid}`);
logger.error(`*****`);
process.exitCode = 11;
exitAfterFlush();
答案 4 :(得分:0)
温斯顿有更好的方法来处理这些例外。
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' })
]
});