Asp. net Core 3.1 Serilog не работает с Azure Webapp - PullRequest
0 голосов
/ 26 марта 2020

Поэтому я хочу использовать 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.

1 Ответ

0 голосов
/ 27 марта 2020

Если у вас та же проблема, что и у меня, где строка подключения пуста во время program.cs.

Обнаружено, что Azure добавляет строки подключения в качестве переменной среды, см. Здесь: https://azure.microsoft.com/en-us/blog/windows-azure-web-sites-how-application-strings-and-connection-strings-work/

Поэтому все, что мне нужно было сделать, это добавить это в мой конструктор конфигурации в program.cs:

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

            config = builder.Build();

Теперь приложение запускается и не жалуется на отсутствующую строку подключения.

...