Поэтому я хочу использовать serilog с конфигом, который выглядит следующим образом, в program.cs:
.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))
;
})
И это работает fantasti c на предпосылке и во время разработки. Но теперь мне нужно, чтобы это работало в Azure. И он ломается, потому что строка подключения пуста. Таким образом, строка подключения «tap» / окно конфигурации azure по какой-то причине не загружается при запуске. Я нашел сообщение с предложением переместить его в startup.cs, поэтому я и сделал. ASP. Net Core 2.1 Serilog SQL Приемник сервера с использованием Azure SQL работает локально, но не из 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.