首页 文章

Winston Logging - 如果另一个传输失败,则恢复传输

提问于
浏览
0

我正在使用winston和winston-elasticsearch来登录Elastic Search . 我没有问题设置传输,一切正常工作 .

无论如何,如果ES服务器无法访问,则在停机期间发送的日志似乎永远丢失 .

有没有办法告诉Winston在Elastic-Search传输失败时(并且只有当时)才能登录?

1 回答

  • 2

    我也试图处理这种情况(即当一个传输无法记录消息时(在我的情况下是一个文件 Logger ,如果有人在配置中提到了错误的文件路径,它可能会失败))通过订阅Logger的“错误”事件 . 但我无法让它发挥作用 .

    我试过的是实例化2个不同的Logger One和File Transport,另一个用Mail Transport然后订阅了第一个 Logger 的“error”事件,并在错误事件中使用Logger with Mail传输发送邮件,但是如果没有触发错误事件,我指定了错误的文件路径,并且Node进程崩溃了 .

    var config = require('config');
    var smtpConfig = config.get('serving.smtp');
    var adClickLogConfig = config.get('adClick.logging');
    var adClickMailConfig = config.get('adClick.mail');
    
    var winston = require('winston');
    require('winston-mail').Mail;
    
    function AdClickLoggingService (staticFunctions){
        this.staticFunctions = staticFunctions;
        var fileName  = adClickLogConfig.filePath + "/" + adClickLogConfig.fileName;
        this.fileLogger = new (winston.Logger)({
            transports: [
                new (winston.transports.File)({
                    filename: fileName,
                    level: adClickLogConfig.level,
                    timestamp : adClickLogConfig.timeStamp,
                    maxsize : adClickLogConfig.maxSize,
                    maxFiles : adClickLogConfig.maxFiles,
                    json : adClickLogConfig.json
                })
            ]
        });
    
        this.fileLogger.on('error', function (err) {
            this.emailLogger.info(err);
        });
    
    
        this.fileLogger.on('logging', function (transport, level, msg, meta) {
            console.log('Message logged' + msg);
            // [msg] and [meta] have now been logged at [level] to [transport]
        });
    
        this.emailLogger = new (winston.Logger)({
            transports: [
                new (winston.transports.Mail)({
                    host: smtpConfig.host,
                    tls: smtpConfig.tls,
                    to : adClickMailConfig.toAddress.join(),
                    from : adClickMailConfig.fromAddress,
                    subject : adClickMailConfig.subject
                })
            ]
        });
    
        this.fileLogger.on('error', function (err) {
            console.log(err);
        });
    };
    
    AdClickLoggingService.prototype = {
        logAdClick:function(id, msg){
            msg.adClickId = id;
            msg = this.staticFunctions.convertToString(msg);
            return this.fileLogger.info(msg);
        }
    };
    

相关问题