如何为ASP.NET Core应用程序配置Azure App Service日志记录提供程序?

6
我正在尝试在我的ASP.NET Core MVC应用中配置自定义日志记录。该应用托管在Azure App Service on Linux (免费版)上。但是日志文件没有出现,我做错了什么?
我的配置:
根据ASP.NET Core日志记录文档 (https://learn.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#azure-app-service-provider),我已向我的应用程序添加了Azure App Service日志提供程序。
public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.AddAzureWebAppDiagnostics();
                })
                .ConfigureServices(serviceCollection => serviceCollection
                    .Configure<AzureFileLoggerOptions>(options =>
                    {
                        options.FileName = "azure-diagnostics-";
                        options.FileSizeLimit = 10 * 1024;
                        options.RetainedFileCountLimit = 5;
                    })
                )
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseUrls("http://*:8080");
                    webBuilder.UseStartup<Startup>();
                });

app.settings中的日志配置:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

我在我的控制器中记录了信息,警告和错误。

根据Azure文档(https://learn.microsoft.com/en-us/azure/app-service/troubleshoot-diagnostic-logs#enable-application-logging-linuxcontainer),我已经在Azure App -> App Service日志中启用了文件系统日志记录:

Azure config

我的应用程序已顺利部署并运行。我期望在应用程序的文件系统中找到名称为“azure-diagnostics”的日志文件。我通过进入Azure App -> SSH并运行以下命令来检查文件系统:

find . -name '*azure-diagnostics*'

该方法没有返回任何内容。我还使用Kudu和VS Cloud Explorer检查了文件系统,但未找到这些文件。如果添加控制台日志记录提供程序,则日志会在标准的Azure日志文件中正常显示。我在这里忽略了什么?

3个回答

3

我尝试使用AzureWebAppDiagnostics日志提供程序无法使其工作,但是通过使用带有文件池的Serilog提供程序,我成功解决了问题。

在program.cs中:

public static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                .WriteTo.File(@"../../LogFiles/azure-diagnostics-", fileSizeLimitBytes: 50 * 1024, rollingInterval: RollingInterval.Day, retainedFileCountLimit: 5)
                .CreateLogger();

            try
            {
                CreateHostBuilder(args).Build().Run();
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseUrls("http://*:8080");
                    webBuilder.UseStartup<Startup>();
                });
    }

UseSeriLog()方法调用替换了默认的MS日志工厂,因此我可以从appsettings中删除日志配置。

现在,我可以看到预期的自定义日志文件出现在/home/LogFiles目录中。


这个不能被标记为正确答案,因为它有一个巨大的缺陷! 使用这种实现方式,你总是会写日志文件,而使用AddAzureWebAppDiagnostics,只有在启用应用程序日志记录时才会启用记录器。如果启用了应用程序日志记录,它将在12小时后自动禁用。文件日志记录会对性能产生影响,我们应该认真对待。 - Rookian
我想要的正是这个 - 始终记录到文件系统。 这是一个概念验证项目,它是否适用于生产使用(可能不是)完全是另一个问题。 如果您可以通过AddAzureWebAppDiagnostics使其工作,请发布单独的答案 - 我尝试过了,但没有成功,也许自那时起微软的人已经修复了它。 - Michal Ciesielski

0

我猜你需要设置用于存储日志的 Blob,你可以尝试设置文件

.ConfigureServices(serviceCollection => serviceCollection
                .Configure<AzureFileLoggerOptions>(options =>
                {
                    options.FileName = "azure-diagnostics-";
                    options.FileSizeLimit = 50 * 1024;
                    options.RetainedFileCountLimit = 5;
                }).Configure<AzureBlobLoggerOptions>(options =>
                {
                    options.BlobName = "log.txt";
                }))

检查示例应用程序


2
我认为Linux上的App Service不支持Blob存储日志,根据这里的文档:https://learn.microsoft.com/en-us/azure/app-service/troubleshoot-diagnostic-logs#enable-application-logging-linuxcontainer。无论如何,我想记录到文件系统中。我已经使用Serilog和文件汇聚器成功配置了它。我将发布一个单独的答案。谢谢! - Michal Ciesielski

0

日志文件的默认位置在 D:\home\LogFiles\Application 文件夹中,默认文件名为 diagnostics-yyyymmdd.txt

在 program.cs 中添加以下提供程序。

.ConfigureLogging(logging =>
{
    logging.AddAzureWebAppDiagnostics();
    logging.AddConsole();
})

在您的代码中调用 logger.LogWarning("message"); 来写入日志文件。如果您使用 LogWarning,请确保将 Level 设置为 Warning 或更详细。
请参考此 issue

1
谢谢,但如果您阅读了描述,这正是我尝试过的。控制台提供程序运行良好,并记录到默认位置(没有D驱动器,因为它是Linux),但我正在尝试设置记录到自定义日志文件。 - Michal Ciesielski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接