2017-02-02 1 views
1

Node.Js에서 Azure 함수를 사용하고 있습니다.Azure 함수 - 다른 호출간에 공유 된 객체

azure 함수의 컨텍스트 객체를 사용하고 Azure 포털 UI에 표시된 함수의 로그에 작성하는 사용자 정의 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 로거를 캡처 (공유)한다는 것입니다. 이것은 단일 호출을 다양한 호출로 반환하고 모든 호출이이를 변이시키기 때문에 사실입니다.

로깅 인프라를 래핑하는 것이 무엇이든간에 격리를 복원하려면이 싱글 톤 동작을 제거해야합니다. 또한 최근에 로거를 변경하여 서로 다른 로그 수준의 메서드를 표시했습니다 log, verbose, error, warn. 곧 출시 될 것입니다.

+0

답변 해 주셔서 감사합니다. Azure 함수를 사용할 때 기본적으로 프로세스 분리가 있다고 생각했습니다 (이 경우 Serverless Architecture 아이디어는 얻을 수 있습니다). 당신이 쓴 것을 보면, 나는 로거를 싱글 톤 객체로 사용할 수 없다는 것을 이해하고이를 변경할 것입니다. 감사. –

+0

그래, 이거 정말 안됐다. 우리가 컨텍스트를 전달하는 대신 console.log를 지원해야하는 또 다른 이유. –

관련 문제