azure - 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 获得的服务提供商一样工作的服务提供商。
解决方案
如果您遇到与我相同的问题,即在 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();
现在应用程序启动并且不会抱怨缺少连接字符串。
推荐阅读
- sql - 如何找到特定的员工总金额
- angular - 如何使用Angular 6从地图返回client_id
- python - 在 python 窗口中使用 mne_browse_raw 浏览脑电图
- node.js - 处理对话流中的音频播放完成回调(媒体响应)
- javascript - 如何让用户更漂亮地在客户端格式化代码?
- reactjs - 如果不支持用户的浏览器,我可以呈现警告消息吗?
- swift - 从 UserDefaults 中检索字符串不起作用
- java - 使用 teamcity 构建时生成工件的示例 java 项目
- python - 可以使用 CNN 的特征图来定位图像中的重要区域吗?
- selenium-webdriver - NUnit:如何根据 [TestFixture(typeof(param))] 中的参数设置测试名称