我正在使用 winston 和 winston-elasticsearch 登录 Elastic Search。我设置传输没有问题,一切正常。
无论如何,如果 ES 服务器无法访问,则在停机期间发送的日志似乎会永远丢失。
有没有办法告诉 Winston 在 Elastic-Search 传输失败时(且仅在)失败时登录文件?
我正在使用 winston 和 winston-elasticsearch 登录 Elastic Search。我设置传输没有问题,一切正常。
无论如何,如果 ES 服务器无法访问,则在停机期间发送的日志似乎会永远丢失。
有没有办法告诉 Winston 在 Elastic-Search 传输失败时(且仅在)失败时登录文件?
我还尝试通过订阅 Logger 的“错误”事件来处理这种情况(即,当传输无法记录消息时(在我的情况下是文件记录器,如果有人在配置中提到错误的文件路径,它可能会失败)) . 但我无法让它工作。
我尝试的是实例化 2 个不同的记录器,一个使用文件传输,另一个使用邮件传输,然后订阅第一个记录器的“错误”事件,并在错误事件中使用带有邮件传输的记录器发送邮件,但如果发生错误事件,则不会触发我指定了错误的文件路径,节点进程崩溃。
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);
}
};