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

Posted

技术标签:

【中文标题】如何为 ASP.NET Core 应用配置 Azure 应用服务日志记录提供程序?【英文标题】:How to configure Azure App Service logging provider for an ASP.NET Core app? 【发布时间】:2020-04-22 20:02:15 【问题描述】:

我正在尝试在我的 ASP.NET Core MVC 应用程序中配置自定义日志记录。该应用托管在 Linux 上的 Azure 应用服务(免费层)上。日志文件没有出现,我做错了什么?

我的配置:

按照 ASP.NET Core 日志记录文档 (https://docs.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://docs.microsoft.com/en-us/azure/app-service/troubleshoot-diagnostic-logs#enable-application-logging-linuxcontainer),我已在 Azure 应用 -> 应用服务日志中启用了对文件系统的日志记录:

我的应用可以正常部署并运行。我期待在应用程序的文件系统中的某处找到一个名为“azure-diagnostics”的日志文件。我通过转到 Azure App -> SSH 并运行检查了文件系统:

find . -name '*azure-diagnostics*'

不返回任何内容。我还使用 Kudu 和 VS Cloud Explorer 检查了文件系统,文件不存在。如果我添加控制台日志记录提供程序,日志会很好地显示在标准 Azure 日志文件中。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

我无法使用 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 小时后自动禁用。文件日志记录会对性能产生影响,我们应该认真对待。 我想要的正是——始终登录到文件系统。这是一个概念验证项目,它是否是生产使用的好主意(可能不是)完全是一个单独的问题。如果你可以让它与 AddAzureWebAppDiagnostics 一起工作,请发布一个单独的答案 - 我试过了,但它没有用,也许微软人已经修复了它。【参考方案2】:

我猜你也需要设置 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";
                ))

查看SAMPLE app

【讨论】:

我认为 Linux 上的应用服务不支持日志的 Blob 存储,根据此处的文档:docs.microsoft.com/en-us/azure/app-service/…。无论如何,我想登录到文件系统。我已经能够通过使用带有文件接收器的 Serilog 来配置它。我将发布一个单独的答案。谢谢!【参考方案3】:

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

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

.ConfigureLogging(logging =>

    logging.AddAzureWebAppDiagnostics();
    logging.AddConsole();
)

在您的代码中调用logger.LogWarning ("message"); 以写入日志文件。如果您使用LogWarning,请务必将级别设置为警告或更详细。

请参考这个issue。

【讨论】:

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

以上是关于如何为 ASP.NET Core 应用配置 Azure 应用服务日志记录提供程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 ASP.NET Core 注册和使用 MediatR 管道处理程序?

如何为 ASP.net/C# 应用程序配置文件值中的值添加与号

如何为 ASP.NET Core 2.2 项目中的子域正确启用 CORS?

如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?

如何为 ASP.NET MVC 5 应用程序设置时区?

如何为 asp.net 核心中的删除按钮应用 sweetalert 或引导模式