首页 文章

如何冲洗温斯顿日志?

提问于
浏览
10

我想在 process.exit 之前冲洗winston Logger .

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

有什么像 logger.flush 可用吗?除了人们抱怨温斯顿没有得到非常积极的维护之外,我找不到任何关于它的信息 .

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

4 回答

  • 1

    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

  • 0

    在Thomas Heymann建议的日志回调中调用 process.exit 将无法确保日志实际被刷新,尤其是在使用 File -transport时 .

    我不会直接调用process.exit,而是在刷新日志后让 Logger 调用 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上测试过

  • 1

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

  • 8

    温斯顿有更好的方法来处理这种异常 .

    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' })
        ]
      });
    

相关问题