Azure Functions - 不同调用之间的共享对象
Azure Functions - shared objects between different invocations
我在 Node.Js 中使用 Azure Functions。
我创建了一个自定义 Node.js 记录器模块,它使用 azure 函数的上下文对象并写入显示在 Azure 门户 UI 中的函数日志。由于我们在多个地方使用它,我们将其定义为单例对象,并将函数的上下文对象注入其中。
然后,我们发现所有其他函数执行都使用相同的记录器对象...并且没有将数据记录到它们自己的上下文日志中。这对我们来说很奇怪,因为我们期望每个函数调用都是隔离的,并且不同调用之间没有共享模块。
这是 azure 函数代码:
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;
应该是这样的吧?我们期望每个函数调用都将被隔离。
传递给您的函数的记录器实例对于每个函数和每个函数调用确实不同。我们为每次调用创建一个新实例。
我相信您所看到的多次调用相互干扰日志记录的任何问题都是由于您的自定义记录器组件造成的。问题是您的共享自定义单例记录器正在跨调用捕获(和共享)特定于调用的 Azure 记录器。这是真的,因为您将单例返回给各种调用,而所有这些调用都在改变它。
无论您包装我们的日志记录基础设施的目标是什么,您都应该删除这种单例行为以恢复隔离。我们最近还对我们的记录器进行了更改,以公开不同日志级别 log
、verbose
、error
、warn
的方法。这将很快推出。
我在 Node.Js 中使用 Azure Functions。
我创建了一个自定义 Node.js 记录器模块,它使用 azure 函数的上下文对象并写入显示在 Azure 门户 UI 中的函数日志。由于我们在多个地方使用它,我们将其定义为单例对象,并将函数的上下文对象注入其中。
然后,我们发现所有其他函数执行都使用相同的记录器对象...并且没有将数据记录到它们自己的上下文日志中。这对我们来说很奇怪,因为我们期望每个函数调用都是隔离的,并且不同调用之间没有共享模块。
这是 azure 函数代码:
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;
应该是这样的吧?我们期望每个函数调用都将被隔离。
传递给您的函数的记录器实例对于每个函数和每个函数调用确实不同。我们为每次调用创建一个新实例。
我相信您所看到的多次调用相互干扰日志记录的任何问题都是由于您的自定义记录器组件造成的。问题是您的共享自定义单例记录器正在跨调用捕获(和共享)特定于调用的 Azure 记录器。这是真的,因为您将单例返回给各种调用,而所有这些调用都在改变它。
无论您包装我们的日志记录基础设施的目标是什么,您都应该删除这种单例行为以恢复隔离。我们最近还对我们的记录器进行了更改,以公开不同日志级别 log
、verbose
、error
、warn
的方法。这将很快推出。