sourcecode

새로운 DI를 사용하여 ILogger를 IWebJobs Startup을 사용하여 Azure 함수에 주입하려면 어떻게 해야 합니까?

codebag 2023. 5. 3. 21:22
반응형

새로운 DI를 사용하여 ILogger를 IWebJobs Startup을 사용하여 Azure 함수에 주입하려면 어떻게 해야 합니까?

사용 중Azure Functionv2. 생성자 주입을 사용하는 함수는 다음과 같습니다.

public sealed class FindAccountFunction
{
    private readonly IAccountWorkflow m_accountWorkflow;

    private readonly IMapper m_mapper;

    private readonly ILogger m_logger;

    public FindAccountFunction(ILogger logger, IMapper mapper, IAccountWorkflow accountWorkflow)
    {
        m_logger = logger;
        m_mapper = mapper;
        m_accountWorkflow = accountWorkflow;
    }

    [FunctionName("FindAccount")]
    public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger logger)
    {
        // Do stuff.
    }
}

시작 클래스에서 Azure 함수에 주입하려는 모든 종속성을 선언합니다.IWebJobsStartup:

    public sealed class Startup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder webJobsBuilder)
        {
            //  Registers the application settings' class.
            webJobsBuilder.Services.AddSingleton<IApplicationSettings, ApplicationSettings>();

            //  ** Registers the ILogger instance **
            //  ** ?? **

            //  Registers the IMapper instance for the contracts.
            var mapperConfiguration = new MapperConfiguration(cfg => cfg.AddProfile(new MyProfile()));

     webJobsBuilder.Services.AddSingleton(mapperConfiguration.CreateMapper());

            // Registers custom services.
            webJobsBuilder.Services.AddTransient<IStorageService, StorageService>();

            webJobsBuilder.Services.AddTransient<IAccountWorkflow, AccountWorkflow>();
        }
   }

Azure 함수는 ILogger에 의존하는 다른 주입된 서비스도 호출합니다. 예를 들어,IAccountWorkflow:

public sealed class AccountWorkflow : IAccountWorkflow
{  
    public AccountWorkflow(ILogger logger, IStorageService storageService)
    {
        if(logger is null)
            throw new ArgumentNullException();
    }
}

문제는 DI가 어떤 것도 찾을 수 없다는 것입니다.ILogger구현 및 null 이후 서비스를 확인하지 못함ILogger주입되었습니다.

질문.

의 주입을 설정하려면 어떻게 해야 합니까?ILoggerIWebJobsStartup?

갱신하다

참조 종속성 주입을 사용합니다.NET Azure 함수

서비스를 등록하는 중

서비스를 등록하려면 구성 방법을 생성하고 구성 요소를 에 추가할 수 있습니다.IFunctionsHostBuilder사례.Azure Functions 호스트가 다음을 생성합니다.IFunctionsHostBuilder구성된 방법으로 직접 전달합니다.

구성 방법을 등록하려면 다음을 사용하여 구성 방법의 유형을 지정하는 어셈블리 속성을 추가해야 합니다.FunctionsStartup기여하다.

그래서 이 경우에는

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]    
namespace MyNamespace {
    public class Startup : FunctionsStartup {
        public override void Configure(IFunctionsHostBuilder builder) {
            //  ** Registers the ILogger instance **
            builder.Services.AddLogging();

            //  Registers the application settings' class.
            //...

            //...omitted for brevity    
        }
    }
}

원래의

서비스 컬렉션에 액세스할 수 있기 때문에 로깅을 추가할 수 있어야 합니다.

public void Configure(IWebJobsBuilder webJobsBuilder) {       

    //  ** Registers the ILogger instance **
    webJobsBuilder.Services.AddLogging();

    //OR
    //webJobsBuilder.Services.AddLogging(builder => {
    //    //...
    //});

    //  Registers the application settings' class.
    //...

    //...removed for brevity
}

그리고 그것을 가지고 있습니다.ILoggerFactoryFunction의 생성자에서.

//...

//Ctor
public FindAccountFunction(ILoggerFactory loggerFactory, IMapper mapper, IAccountWorkflow accountWorkflow) {
    m_logger = loggerFactory.CreateLogger<FindAccountFunction>();
    m_mapper = mapper;
    m_accountWorkflow = accountWorkflow;
}

//...

저는 이 문제를 해결할 수 있었습니다.

다음과 같이 제 수업에 주입합니다.

MyClass.cs :

public class MyClass
{
    private readonly ILogger<MyClass> _logger;

    public MyClass(ILogger<MyClass> logger)
    {
        _logger = logger;
    }
}

Startup.cs :

[assembly: FunctionsStartup(typeof(Namespace.Startup))]   

namespace Namespace {    
public class Startup : FunctionsStartup 
{
    public override void Configure(IFunctionsHostBuilder builder) 
    {
        builder.Services.AddLogging(); 
    }
  }
}

의 호출을 제거해야 합니다.AddLogging시작 클래스의 메서드입니다.기본 로거는 zure 함수 호스트에 의해 이미 설정되어 있습니다.

[assembly: WebJobsStartup(typeof(StartUp))]
public class StartUp : IWebJobsStartup
{
    public void Configure(IWebJobsBuilder builder)
    {
        builder.Services.AddSingleton<AppSettings>();

        builder.Services.AddTransient<IMyService, MyService>();
    }
}

public MyFunction(IMyService service, ILogger<IMyService> logger)
{
    this.service = service;
    this.logger = logger;
}

인스턴스 메소드는 이제 Azure 함수 런타임 2.0.12265 이후로 Zure 함수와 함께 지원됩니다.

여기에 이미지 설명 입력

함수 Startup 클래스에 클래스를 등록하는 것 외에도, 우리는 네임스페이스를 다음에 추가해야 합니다.host.json또한 파일을 사용하여 App Insight에 메시지를 기록할 수 있습니다.추가하지 않으면 로컬로 메시지를 콘솔에 기록하기만 하지만 zure에 배포하면 아무것도 기록하지 않고 오류도 발생하지 않습니다.

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "FunctionProjectNameSpace.RegisteredClass": "Information"
    }
  }
}

참고용 샘플 코드 - https://gist.github.com/nareshnagpal06/82c6b4df2a987087425c32adb58312c2

추가할 수 있습니다.

  "logging": {
    "fileLoggingMode": "debugOnly",
    "logLevel": {
      "default": "Information"
    }
  }

Ilogger Factory를 사용하려면 DI를 추가할 필요가 없습니다.

언급URL : https://stackoverflow.com/questions/54876798/how-can-i-use-the-new-di-to-inject-an-ilogger-into-an-azure-function-using-iwebj

반응형