【问题标题】:Winston Logging - recovery transport if another transport failWinston Logging - 如果另一个传输失败,则恢复传输
【发布时间】:2014-12-02 01:32:41
【问题描述】:

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

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

有没有办法告诉 Winston 在 Elastic-Search 传输失败时(且仅在)失败时登录文件?

【问题讨论】:

    标签: node.js elasticsearch winston


    【解决方案1】:

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

    我尝试的是实例化 2 个不同的记录器,一个使用文件传输,另一个使用邮件传输,然后订阅第一个记录器的“错误”事件,并在错误事件中使用带有邮件传输的记录器发送邮件,但错误事件是如果我指定错误的文件路径并且 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);
        }
    };
    

    【讨论】:

    • 感谢您的回复。我想这是一个“不工作”的建议,可能适用于我的场景。只有当我有办法检查错误是否由指定的传输(winston-elasticsearch)生成时,它才是一个很好的解决方案。
    • 为此,您可以创建一个只有一个 Transport(winston-elasticsearch) 的记录器实例并订阅其错误事件,然后您可以确定在登录到 elasticsearch 时发生了错误。
    • 不幸的是,这不是一个可行的方法,因为它会导致所有日志的重复(或至少重构),而且我们正在谈论大量的代码行:它会花费很多时间/金钱。
    • 这就是为什么我总是像在我的示例中所做的那样在我的类函数中包装第三方调用,然后如果我需要更改库的某些功能,我必须在一个地方进行。
    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多