Как заставить Serilog замолчать в интеграционных тестах с новой минимальной моделью хостинга .NET 6 ⇐ C#
Как заставить Serilog замолчать в интеграционных тестах с новой минимальной моделью хостинга .NET 6
У меня есть проект веб-API .NET 6 с существующими интеграционными тестами для некоторых конечных точек API. Проект использует Serilog для журналирования, и до сих пор все было в порядке.
Я перенес код на новую минимальную модель хостинга, удалив при этом класс Startup. Я исправил интеграционные тесты для работы с новой моделью, и пока все работает. Единственная проблема, с которой я столкнулся, заключается в том, что интеграционные тесты теперь рассылают спам-запросы журнала.
Для Serilog у меня есть двухэтапная настройка, вот как выглядит Program.cs:
Программа общедоступного частичного класса { общедоступная статическая строка ApplicationVersion => typeof(Program).Assembly .GetCustomAttribute() .Информационная версия; /// /// Взлом для предотвращения дублирования инициализации регистратора при параллельном выполнении интеграционных тестов. /// public static bool IsIntegrationTestRun = false; public static int Main(string[] args) { var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Производство"; если (!IsIntegrationTestRun) { // дополнительный регистратор только для запуска приложения Log.Logger = новая конфигурация LoggerConfiguration() .Enrich.FromLogContext() .WriteTo.Консоль() .CreateBootstrapLogger(); } пытаться { Log.Information("Запуск v{version} в среде {env}.", ApplicationVersion, env); вар строитель = WebApplication.CreateBuilder(args); builder.Configuration.AddJsonFile("appsettings.Local.json", true, true); // Фактический регистратор для внедрения зависимостей builder.Host.UseSerilog((ctx, lc) => { lc.ReadFrom.Configuration(ctx.Configuration); }); // ... вар приложение = builder.Build(); // ... используя (область IServiceScope = app.Services.CreateScope()) { var dataContext =scope.ServiceProvider.GetRequiredService(); dataContext.Database.Migrate(); } app.UseSerilogRequestLogging(c => { c.EnrichDiagnosticContext = (diagnosticContext, httpContext) => { DiagnosticContext.Set("Хост", httpContext.Request.Host.ToString()); DiagnosticContext.Set("UserAgent", httpContext.Request.Headers["User-Agent"]); }; c.GetLevel = LogLevelHelper.GetRequestLevel; }); // ... приложение.Выполнить(); вернуть 0; } поймать (Исключение ex) { Log.Fatal(ex, «Хост неожиданно завершил работу.»); возврат 1; } окончательно { Журнал.CloseAndFlush(); } } } Это моя WebApplicationFactory:
[CollectionDefinition("WebApplicationFactory")] общедоступный класс CustomWebApplicationFactory: WebApplicationFactory где TStartup: класс { защищенное переопределение void ConfigurationWebHost (построитель IWebHostBuilder) { // Несколько хакерски, но предотвращает дублирование инициализации регистратора при параллельном выполнении интеграционных тестов. Program.IsIntegrationTestRun = true; builder.ConfigureAppConfiguration((контекст, конструктор) => { // Загружаем пользовательские настройки приложения для теста builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.Test.json")); // необязательная загрузка личных настроек, включенных в gitignore builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.LocalTest.json"), true); builder.AddEnvironmentVariables(); }); // builder.ConfigureLogging(lb => lb.ClearProviders()); Log.Logger = новый LoggerConfiguration().MinimumLevel.Fatal().CreateLogger(); // ... } } который используется следующим образом:
[Collection("WebApplicationFactory")] общедоступный класс SomeTests: IClassFixture { частный только для чтения CustomWebApplicationFactory _factory; public SomeTests (фабрика CustomWebApplicationFactory) { _фабрика = фабрика; } [Факт] общедоступная асинхронная задача Get_Some_ReturnsSomething() { // настраивать ... Клиент HttpClient = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Авторизация", RequestHelper.GetBearerAuthenticationHeaderValue(пользователь)); RequestHelper.AddStrangeHeader(client, user.StrangeKey); Ответ HttpResponseMessage = ожидайте client.GetAsync("/api/some"); Assert.Equal(HttpStatusCode.OK, ответ.StatusCode); var res = ждут RequestHelper.DeserializeResponse(ответ); Assert.Equal(SomeCount, res.Count); } } Как вы можете видеть, я расширил шаблон appsettings.json, чтобы использовать локальный файл gitignored для локальной разработки (чтобы сохранить секреты в репозитории) и дополнительный appsettings.Test.json (и другой git проигнорировал appsettings.LocalTest.json с дополнительными настройками для тестов, такими как другое соединение с базой данных).
Когда я запускаю интеграционные тесты, консоль заполонена операторами журнала. Как ни странно, кажется, не все записывается, например, я не вижу журналов запросов. Но я могу видеть журналы миграции базы данных несколько раз, например:
[09:57:38 INF Microsoft.EntityFrameworkCore.Migrations] Применение миграции '20210224073743_InitialSchema'
или этот
[09:57:40 DBG lJty8ESu24x-MY6n4EYr Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler] Токен успешно проверен..
Я пробовал много вещей, например, устанавливал минимальный уровень журнала на Fatal или напрямую заменял Log.Logger новым регистратором.
Само приложение использует внедренный ILogger вместо статического Log.Logger. Может ли кто-нибудь подсказать мне, как решить эту проблему или что мне можно попробовать дальше?
Похоже, что при ведении журнала учитываются настройки из моего файла appsettings.Test.json. Когда я уменьшаю минимальный уровень для отладки, я вижу, что при тестовом запуске печатается больше журналов. Но почему сообщение о миграции записывается, даже если я установил минимальный уровень Fatal?
У меня есть проект веб-API .NET 6 с существующими интеграционными тестами для некоторых конечных точек API. Проект использует Serilog для журналирования, и до сих пор все было в порядке.
Я перенес код на новую минимальную модель хостинга, удалив при этом класс Startup. Я исправил интеграционные тесты для работы с новой моделью, и пока все работает. Единственная проблема, с которой я столкнулся, заключается в том, что интеграционные тесты теперь рассылают спам-запросы журнала.
Для Serilog у меня есть двухэтапная настройка, вот как выглядит Program.cs:
Программа общедоступного частичного класса { общедоступная статическая строка ApplicationVersion => typeof(Program).Assembly .GetCustomAttribute() .Информационная версия; /// /// Взлом для предотвращения дублирования инициализации регистратора при параллельном выполнении интеграционных тестов. /// public static bool IsIntegrationTestRun = false; public static int Main(string[] args) { var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Производство"; если (!IsIntegrationTestRun) { // дополнительный регистратор только для запуска приложения Log.Logger = новая конфигурация LoggerConfiguration() .Enrich.FromLogContext() .WriteTo.Консоль() .CreateBootstrapLogger(); } пытаться { Log.Information("Запуск v{version} в среде {env}.", ApplicationVersion, env); вар строитель = WebApplication.CreateBuilder(args); builder.Configuration.AddJsonFile("appsettings.Local.json", true, true); // Фактический регистратор для внедрения зависимостей builder.Host.UseSerilog((ctx, lc) => { lc.ReadFrom.Configuration(ctx.Configuration); }); // ... вар приложение = builder.Build(); // ... используя (область IServiceScope = app.Services.CreateScope()) { var dataContext =scope.ServiceProvider.GetRequiredService(); dataContext.Database.Migrate(); } app.UseSerilogRequestLogging(c => { c.EnrichDiagnosticContext = (diagnosticContext, httpContext) => { DiagnosticContext.Set("Хост", httpContext.Request.Host.ToString()); DiagnosticContext.Set("UserAgent", httpContext.Request.Headers["User-Agent"]); }; c.GetLevel = LogLevelHelper.GetRequestLevel; }); // ... приложение.Выполнить(); вернуть 0; } поймать (Исключение ex) { Log.Fatal(ex, «Хост неожиданно завершил работу.»); возврат 1; } окончательно { Журнал.CloseAndFlush(); } } } Это моя WebApplicationFactory:
[CollectionDefinition("WebApplicationFactory")] общедоступный класс CustomWebApplicationFactory: WebApplicationFactory где TStartup: класс { защищенное переопределение void ConfigurationWebHost (построитель IWebHostBuilder) { // Несколько хакерски, но предотвращает дублирование инициализации регистратора при параллельном выполнении интеграционных тестов. Program.IsIntegrationTestRun = true; builder.ConfigureAppConfiguration((контекст, конструктор) => { // Загружаем пользовательские настройки приложения для теста builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.Test.json")); // необязательная загрузка личных настроек, включенных в gitignore builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.LocalTest.json"), true); builder.AddEnvironmentVariables(); }); // builder.ConfigureLogging(lb => lb.ClearProviders()); Log.Logger = новый LoggerConfiguration().MinimumLevel.Fatal().CreateLogger(); // ... } } который используется следующим образом:
[Collection("WebApplicationFactory")] общедоступный класс SomeTests: IClassFixture { частный только для чтения CustomWebApplicationFactory _factory; public SomeTests (фабрика CustomWebApplicationFactory) { _фабрика = фабрика; } [Факт] общедоступная асинхронная задача Get_Some_ReturnsSomething() { // настраивать ... Клиент HttpClient = _factory.CreateClient(); client.DefaultRequestHeaders.Add("Авторизация", RequestHelper.GetBearerAuthenticationHeaderValue(пользователь)); RequestHelper.AddStrangeHeader(client, user.StrangeKey); Ответ HttpResponseMessage = ожидайте client.GetAsync("/api/some"); Assert.Equal(HttpStatusCode.OK, ответ.StatusCode); var res = ждут RequestHelper.DeserializeResponse(ответ); Assert.Equal(SomeCount, res.Count); } } Как вы можете видеть, я расширил шаблон appsettings.json, чтобы использовать локальный файл gitignored для локальной разработки (чтобы сохранить секреты в репозитории) и дополнительный appsettings.Test.json (и другой git проигнорировал appsettings.LocalTest.json с дополнительными настройками для тестов, такими как другое соединение с базой данных).
Когда я запускаю интеграционные тесты, консоль заполонена операторами журнала. Как ни странно, кажется, не все записывается, например, я не вижу журналов запросов. Но я могу видеть журналы миграции базы данных несколько раз, например:
[09:57:38 INF Microsoft.EntityFrameworkCore.Migrations] Применение миграции '20210224073743_InitialSchema'
или этот
[09:57:40 DBG lJty8ESu24x-MY6n4EYr Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler] Токен успешно проверен..
Я пробовал много вещей, например, устанавливал минимальный уровень журнала на Fatal или напрямую заменял Log.Logger новым регистратором.
Само приложение использует внедренный ILogger вместо статического Log.Logger. Может ли кто-нибудь подсказать мне, как решить эту проблему или что мне можно попробовать дальше?
Похоже, что при ведении журнала учитываются настройки из моего файла appsettings.Test.json. Когда я уменьшаю минимальный уровень для отладки, я вижу, что при тестовом запуске печатается больше журналов. Но почему сообщение о миграции записывается, даже если я установил минимальный уровень Fatal?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как добавить имитируемый S3Client в контекст Spring в интеграционных тестах
Anonymous » » в форуме JAVA - 0 Ответы
- 42 Просмотры
-
Последнее сообщение Anonymous
-