首页 > 解决方案 > Asp.net Core 3.1 Serilog 不适用于 Azure Webapp

问题描述

所以我想在program.cs中使用serilog和一个看起来像这样的配置:

 .UseSerilog((provider, ContextBoundObject, loggerConfig) =>
               {
                   var name = Assembly.GetExecutingAssembly().GetName();
                   loggerConfig

                    .ReadFrom.Configuration(config)
                    .Enrich.FromLogContext()
                    .Enrich.WithExceptionDetails()
                    .Enrich.WithAspnetcoreHttpcontext(provider, AddCustomContextInfo)
                    .Enrich.WithProperty("Assembly", $"{name.Name}")
                    .Enrich.WithProperty("Version", $"{name.Version}")
                    .WriteTo.Debug()
                    .WriteTo.MSSqlServer(config.GetConnectionString("LoggingConnection"),
                    "ApplicationLogs", autoCreateSqlTable: true,
                    columnOptions: MSSqlSerilogConfig.GetSqlColumnOptions(), batchPostingLimit: 1, period: new TimeSpan(0, 0, 1))

                    ;
               })

这在前提和开发过程中非常有效。但现在我需要它在 Azure 中运行。它会因为连接字符串为空而中断。因此,出于某种原因,Azure 门户配置“tap”/window connectionstring 在开始时未加载。我发现一个帖子建议我应该把它移到startup.cs,所以我做了。 使用 Azure SQL 的 ASP.Net Core 2.1 Serilog SQL Server Sink 在本地工作,但不是来自 Azure 应用服务

它不再抱怨连接字符串,但是,现在我无法为 httpcontext 获得有效的服务提供者,而我需要丰富器 .Enrich.WithAspnetcoreHttpcontext(-The IServiceProvider-, AddCustomContextInfo)。注释掉该行会使项目运行。

错误:

System.NullReferenceException: Object reference not set to an instance of an object. at
 Serilog.Enrichers.AspnetcoreHttpcontext.LoggerEnrichmentConfigurationExtensions.WithAspnetcoreHttpcontext
(LoggerEnrichmentConfiguration enrichmentConfiguration, IServiceProvider serviceProvider, Func`2 customMethod)

AddCustomContextInfo 方法信息:

public static UserIdentity AddCustomContextInfo(IHttpContextAccessor ctx)
{
   HttpContext context = ctx.HttpContext;
   ...
}

我不知道我应该如何获得一个像您从 program.cs 获得的服务提供商一样工作的服务提供商。

标签: azureasp.net-coreazure-web-app-serviceserilog

解决方案


如果您遇到与我相同的问题,即在 program.cs 期间连接字符串为空。

发现 Azure 将连接字符串添加为环境变量,请参见此处: https ://azure.microsoft.com/en-us/blog/windows-azure-web-sites-how-application-strings-and-connection-strings-工作/

所以我所要做的就是将它添加到我在 program.cs 中的配置生成器中:

  ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
            builder.AddEnvironmentVariables(); // this was missing
...

            config = builder.Build();

现在应用程序启动并且不会抱怨缺少连接字符串。


推荐阅读