ASP.NET 核心 Azure WebJob 未记录到 Azure 存储

ASP.NET Core Azure WebJob not logging to Azure Storage

以前,当我在 .NET 中创建 Azure webjobs 时,它会自动将日志记录配置到 Azure 存储上路径 /azure-webjobs-hosts/output-logs/.txt 上的文本文件。但是,现在当我使用 .NET Core 和 3.0.14 版的 Webjobs SDK 时,默认情况下它不再具有此行为。

登录到控制台和 Application Insights 与我当前的设置配合得很好,但是我确实希望通过绑定的 ILogger 将文本文件登录到 Azure 存储。我已经按照有关如何配置它的官方指南进行操作,但它都指向存储队列,我不确定这是一个好的方法以及如何调整它。

配置代码:

static async Task Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddEnvironmentVariables()
        .Build();

    builder.UseEnvironment("development");
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddAzureStorage();
    });
    builder.ConfigureLogging((context, b) =>
    {
        b.AddConsole();

        string instrumentationKey = context.Configuration["ApplicationInsightsKey"];
        if (!string.IsNullOrEmpty(instrumentationKey))
        {
            b.AddApplicationInsightsWebJobs(o => o.InstrumentationKey = instrumentationKey);
        }

    });
    builder.ConfigureServices(s => s.AddSingleton<IConfigurationRoot>(config));

    var host = builder.Build();
    using (host)
    {
        var jobHost = host.Services.GetService(typeof(IJobHost)) as JobHost;

        await host.StartAsync();
        await jobHost.CallAsync("Run");
        await host.StopAsync();
    }
}

职位代码:

[NoAutomaticTrigger]
public async Task Run(ILogger logger)
{
    logger.LogInformation("I want this text in console as well as on Azure Storage");

    // ..logic
}

如果要将日志(通过 ILogger)保存到 blob 存储,则需要将 webjobs 发布到 azure。您可以按照以下步骤操作:

1.Add b.AddAzureWebAppDiagnostics(); 方法(需要安装 nuget 包 Microsoft.Extensions.Logging.AzureAppServices)到 builder.ConfigureLogging 代码块:

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

            //other code
        });

2.Publish 到azure,然后在azure portal -> 相关应用服务 -> 应用服务日志,配置"Application Logging(blob)",截图如下:

3.After 运行 webjob,导航到步骤2中配置的blob存储,可以看到生成了一个新的日志文件,以及所有的日志(包括通过ILogger的日志)在文件中。

I do want text file logging on Azure Storage as well via the binded ILogger.

Serilog.Sinks.AzureBlobStorage 可以帮助将日志写入 Azure Blob 存储,这在 Azure 和本地都可以很好地工作。

在Program.cs

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

    var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

    var AzureBlobStorageLogger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .CreateLogger();

    b.AddSerilog(logger: AzureBlobStorageLogger);
});

在appsettings.json

{
  "Serilog": {
    "Using": [
      "Serilog.Sinks.AzureBlobStorage"
    ],
    "WriteTo": [
      {
        "Name": "AzureBlobStorage",
        "Args": {
          "connectionString": "{your_connectionString_here}",
          "storageContainerName": "azure-webjobs-hosts",
          "storageFileName": "output-logs/{yyyy}/{MM}/{dd}/log.txt"
        }
      }
    ]
  },
  //other settings
  //...
}

此外,正如@IvanYang所说,您也可以通过添加Azure diagnostics logger来实现它,但是此提供程序仅在Azure环境中的项目运行时有效。当我们在本地 运行 webjob 时,它不会将日志写入 Azure Blob 存储。