20

我想在之前 process.exit刷新winston 记录器。

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

有没有类似logger.flush的东西?我找不到任何关于它的东西,除了人们抱怨温斯顿没有得到非常积极的维护。

作为替代方案,是否有任何流行的(积极维护的)多传输日志框架提供刷新功能?

4

5 回答 5

13

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

于 2013-09-13T15:33:15.727 回答
2

不幸的是,Winston 有时会在传输有机会刷新之前调用日志回调,因此接受的答案仍然可能导致未保存的日志消息(尤其是在事件循环的第一轮)。在winston-log-and-exit包/补丁中实现了更好的解决方案。

于 2017-01-20T18:46:55.100 回答
1

像 Thomas Heymann 建议的那样在日志回调中调用process.exit并不能确保日志被实际刷新,尤其是在使用File-transport 时。

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

记录器.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 上测试

于 2015-10-10T11:52:38.203 回答
1

这可能会帮助某人。logger 是 winston.createLogger 的一个实例,它定义了两个传输(控制台和文件)。退出代码反映在 shell 中。

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();
于 2020-07-09T01:13:27.667 回答
-2

Winston 有更好的方法来处理这种异常。

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' })
    ]
  });
于 2014-01-08T02:45:09.547 回答