Azure functions Azure函数-不同调用之间的共享对象

Azure functions Azure函数-不同调用之间的共享对象,azure-functions,Azure Functions,我正在Node.Js中使用Azure函数 我创建了一个自定义Node.js logger模块,它使用azure函数的上下文对象并写入函数的日志,该日志显示在azure门户UI中。因为我们在多个地方使用它,所以我们将它定义为singleton对象,并将函数的上下文对象注入其中 然后,我们发现所有其他函数的执行都使用同一个logger对象。。。并且没有将数据记录到自己的上下文日志中。这对我们来说非常奇怪,因为我们期望每个函数调用都是隔离的,不同调用之间没有共享模块 这是azure功能代码: var

我正在Node.Js中使用Azure函数

我创建了一个自定义Node.js logger模块,它使用azure函数的上下文对象并写入函数的日志,该日志显示在azure门户UI中。因为我们在多个地方使用它,所以我们将它定义为singleton对象,并将函数的上下文对象注入其中

然后,我们发现所有其他函数的执行都使用同一个logger对象。。。并且没有将数据记录到自己的上下文日志中。这对我们来说非常奇怪,因为我们期望每个函数调用都是隔离的,不同调用之间没有共享模块

这是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
。这将很快推出。

感谢您的回复。当我使用Azure函数时,我认为进程隔离是默认的(据我所知,这是无服务器架构的想法)。从您所写的内容中,我了解到我不能将记录器用作单例对象,我将对此进行更改。谢谢。是的,这真的很糟糕。他们应该只支持console.log而不是让我们传递上下文的另一个原因。