如何为 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?