首页 > 解决方案 > 如何在 Azure WebJob 中通过 DI 配置日志记录

问题描述

我正在使用 dotnet 核心开发 Azure WebJobs (3.0.6)。我参考了微软的入门指南。根据示例,我希望有一个控制台日志记录开始。该指南的范围是有限的。在我的应用程序中,我将在不同的 dll 中使用许多类。我无法弄清楚如何在这些类中添加日志记录。示例代码是

// 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();
    }
}

// 队列触发类

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 类在不同的程序集中

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

我在 dotnet core 控制台应用程序中提到了几个 DI 示例,它们使用服务收集方法。我也检查了这个博客,但对我来说,这就是我所做的,但我的 ILogger 没有得到解决。当我创建 MyWorker 实例时,它要求我传递一个 ILogger 实例

标签: c#azure.net-coreazure-webjobs

解决方案


您已接近解决方案。您需要更改的主要内容是让服务集合MyWorker为您创建实例。

我迅速扩展了我最近的 Webjob 示例项目,以包括带有依赖注入的控制台日志记录。请参阅此提交以了解我如何添加它。

您主要需要为您的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()
  }
}

推荐阅读