简体   繁体   中英

How to configure Logging via DI in Azure WebJob

I am working on Azure WebJobs (3.0.6) using dotnet core. I referred Microsoft's Get Started Guide . Per the example I wanted to have a console logging to begin with. The scope of that guide is limited. In my application, I will be using many classes in a different dll. I am not able to figure out how can I add logging in those classes. The sample code is

// The main method
static async Task Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddAzureStorage();
    });

   builder.ConfigureLogging((context, b) =>
   {
       b.AddConsole();
    });

    var host = builder.Build();
    using (host)
    {
        await host.RunAsync();
    }
}

// The queue trigger class

public class QueueListenerService
{
  public static void QueueListener([QueueTrigger("myqueue")] string message, ILogger logger)
  {
    logger.LogInformation("The logger works here");
    // how can I pass an instance of ILogger in the constructor below
    MyWorker myWorker = new MyWorker();
  }
}

// MyWorker Class in a different assembly

public class MyWorker
{
  public MyWorker(ILogger logger)
  {
    // I want to use logger here being injected
  }
}

I have referred several examples of DI in dotnet core console applications and they use service collection approach. I also check this blog but to me, this is what I have done and yet my ILogger is not being resolved. It ask me to pass an instance of ILogger when I create MyWorker instance

You are close to the solution. The main thing you need to change is to let the service collection create the MyWorker instance for you.

I quickly extended my recent Webjob sample project to include console logging with dependency injection. See this commit for how I added it.

You mainly need to use constructor dependency injection for your QueueListenerService .

            builder.ConfigureServices(services =>
            {
                services.AddScoped<QueueListenerService>();
                services.AddScoped<MyWorker>();
            });
public class QueueListenerService
{
  public QueueListenerService(MyWorker worker){
    _Worker = worker;
  }

  public static void QueueListener([QueueTrigger("myqueue")] string message, ILogger logger)
  {
    logger.LogInformation("The logger works here");

    _Worker.DoStuff()
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM