我正在使用Azure函数与Node.Js.
我创建了一个自定义Node.js记录器模块,该模块使用azure函数的上下文对象并写入Azure门户UI中显示的函数日志。由于我们在多个地方使用它,我们将它定义为单例对象,并将函数的上下文对象注入其中。
然后,我们发现所有其他函数执行都使用相同的logger对象......并且没有将数据记录到他们自己的上下文日志中。这对我们来说非常奇怪,因为我们期望每个函数调用都是隔离的,并且在不同的调用之间没有共享模块。
这是天蓝色的功能代码:
var Logger = require( '../custom_modules/logger/customLogger.js');
module.exports = function (azureContext) {
function infoFn(msg){
azureContext ? azureContext.log(msg) : console.log(msg);
}
function errorFn(msg){
azureContext ? azureContext.log(msg) : console.error(msg);
}
var logger = Logger(infoFn, errorFn);
logger.info('function was triggered');
azureContext.done();
}
这是记录器模块代码:
var _customLogger;
var CustomLogger = function (info, error) {
this.error = error;
this.info = info;
};
function logger(info, error) {
if (!_customLogger) {
_customLogger = new CustomLogger(info, error);
} else {
if(info){
_customLogger.info = info;
}
if(error){
_customLogger.error = error;
}
}
return _customLogger;
}
module.exports = logger;
假设是这样的吗?我们希望每个函数调用都是隔离的。
答案 0 :(得分:2)
传递给函数的logger实例对于每个函数和每个函数调用确实是不同的。我们为每次调用创建一个新实例。
我相信,您通过多次调用干扰彼此日志记录时遇到的任何问题都归因于您的自定义记录器组件。问题是您的共享自定义单例记录器正在跨调用捕获(和共享)特定于调用的Azure记录器。这是正确的,因为您将单例返回到各种调用,并且所有这些调用都在改变它。
无论您的目标是包装我们的日志记录基础结构,您都应该删除此单例行为以恢复隔离。我们最近还对记录器进行了更改,以公开不同日志级别log
,verbose
,error
,warn
的方法。那将很快推出。