2017-02-02 11 views
1

私はNode.JsでAzure関数を使用しています。Azure関数 - 異なる呼び出し間の共有オブジェクト

私は、AzureポータルUIに表示されているAzure関数のコンテキストオブジェクトを使用して関数のログに書き込むカスタムNode.jsログモジュールを作成しました。複数の場所でそれを使用しているので、それをシングルトンオブジェクトとして定義し、その関数のコンテキストオブジェクトをそれに注入しました。

次に、他のすべての関数の実行が同じロガーオブジェクトを使用していて、データを独自のコンテキストログに記録していないことがわかりました。各関数の呼び出しが分離され、異なる呼び出しの間に共有モジュールが存在しないことが予想されたので、これは非常に奇妙です。

これは、紺碧の機能コードです:

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; 

が、それはこのようにすると仮定されていますか?私たちは、それぞれの関数呼び出しが分離されることを期待していました。

答えて

2

関数に渡されるロガーインスタンスは、実際には関数ごとに、関数呼び出しごとに異なります。呼び出しごとに新しいインスタンスを作成します。

私は、複数の呼び出しが相互にロギングするのを妨げていると思われる問題は、カスタムロガーコンポーネントによるものだと考えています。問題は、共有カスタムシングルロガーが呼び出し間で呼び出し固有のAzureロガーをキャプチャ(および共有)していることです。シングルトンをさまざまな呼び出しに戻しているため、これらの呼び出しのすべてがそれを変更しているため、これは当てはまります。

ログインフラストラクチャをラッピングする目的が何であれ、このシングルトンの動作を削除して分離を復元する必要があります。また、最近ログレベルを変更して、異なるログレベルのメソッドを公開しましたlogverboseerrorwarnそれはすぐに公開されます。

+0

ご回答いただきありがとうございます。私は、Azure関数を使用しているときにプロセスの分離がデフォルトで行われていると考えていました(これは私が得る限り、Serverless Architectureの考え方です)。あなたが書いたことから、私はシングルトンオブジェクトとしてロガーを使うことができないと分かりました。私はそれを変更します。ありがとう。 –

+0

ええ、これは本当に吸う。しかし、私たちにコンテキストを渡すのではなく、console.logをサポートする必要があるもう一つの理由。 –

関連する問題