Подтвердить что ты не робот

Является ли запись .NET Core 2.0 нарушенной?

Я не могу получить информацию журнала уровня трассировки, выведенную после обновления до .NET Core 2.0 (+ ASP.NET Core 2.0).

Фактически, если я выполняю проект dotnet new web и добавляю код ниже в Startup for Configure, я не получаю никаких сообщений трассировки или отладки журнала, но дважды получаю сообщения Information and Error. Комментируя вызов .AddConsole(), выводятся эти (информация и ошибка) только один раз - это означает, что он автоматически настраивается поставщиком консоли по умолчанию. Имейте в виду, что это проект "Файл → Новый", в Program.cs нет ничего настраиваемого для ведения журнала или конфигурации вообще, кроме того, что я добавил. Кто-нибудь видел вещи? Или я должен зарегистрировать для него проблему GitHub.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Microsoft.Extensions.Logging.LogLevel.Trace);

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.Run(async (context) =>
        {
            var logger = loggerFactory.CreateLogger("Blah");
            logger.LogTrace("Hello world : Trace");
            logger.LogDebug("Hello world : Debug");
            logger.LogInformation("Hello world : Information");
            logger.LogError("Hello world : Error");

            await context.Response.WriteAsync("Hello World!");
        });
    }
4b9b3361

Ответ 1

Настройка способа записи немного изменилась... Рекомендуемый способ (и он довольно хорошо документирован в этой проблеме/объявлении GitHub для этого нужно настроить регистраторы по методу AddLogging, например

services.AddLogging(builder =>
{
    builder.AddConfiguration(Configuration.GetSection("Logging"))
        .AddConsole()
        .AddDebug();
});

И используйте appsettings.json как

{
  "ApplicationInsights": {
    "InstrumentationKey": ""
  },
  "Logging": {
    "IncludeScopes": false,
    "Console": {
      "LogLevel": {
        "Default": "Warning",
        "System": "Information",
        "Microsoft": "Information"

      }
    }
  }
}

Обратите внимание, что структура appsettings.json изменилась с того, что раньше было в .NET Core 1.x, и что запись Logging в appsettings.json теперь имеет в ней имена поставщиков журналов, что позволяет вам настраивать уровни ведения журнала для каждого поставщика протоколирования.

Ранее запись в appsettings.json применима только к регистратору консоли.

В качестве альтернативы, теперь журнал может быть перемещен внутри WebHostBuilder.

public static void Main()
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddJsonFile("hosting.json", optional: false)
                .AddEnvironmentVariables();
        })
        .ConfigureLogging((webhostContext, builder) => {
            builder.AddConfiguration(webhostContext.Configuration.GetSection("Logging"))
            .AddConsole()
            .AddDebug();
        })
        .UseIISIntegration()
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .Build();

    host.Run();
}

Update

Если вы не хотите использовать appsettings.json, можно также зарегистрировать фильтры в коде.

services.AddLogging(builder =>
{
    builder.AddConfiguration(Configuration.GetSection("Logging"))
        // filter for all providers
        .AddFilter("System", LogLevel.Debug)
        // Only for Debug logger, using the provider type or it alias
        .AddFilter("Debug", "System", LogLevel.Information)
        // Only for Console logger by provider type
        .AddFilter<DebugLoggerProvider>("System", LogLevel.Error)
        .AddConsole()
        .AddDebug();
});

Ответ 2

Я потратил почти двадцать минут, чтобы понять, что, поскольку Configuration.GetSection("Logging") в файле Startup.cs читает раздел "Logging" из конфига в файле appsettings.json, который был настроен как "Error". Изменив его на "Information" или что-то меньшее, устраните проблему.

Здесь выглядит файл appsettinsg.json:

{
  "Logging": {
    "IncludeScopes": true,
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
}

Чтобы узнать больше о уровнях ведения журнала (например, в "Information"), проверьте эту ссылку, которая также предоставляет общие информация о регистрации в ASP.NET Cor.

Я просто размещаю здесь, на всякий случай, если вы столкнетесь с какой-либо проблемой при работе с журналом, убедитесь, что вы прошли через этот файл JSON.

Ответ 3

Ничто из этого не работает для меня Единственным обходным решением было написать метод

private void ConfigLogging( ILoggingBuilder builder ) {
    builder.SetMinimumLevel( LogLevel.Trace );
    //... additional configuration...
}

и при использовании метода расширения AddLogging напишите его как

services.AddLogging( ConfigLogging );