Ведение журнала ASP.NET Core слишком многословно - PullRequest
0 голосов
/ 24 ноября 2018

У меня проблемы с регистрацией конфигурации в приложении ASP.NET Core 2.1 WebApi.Я успешно выполнил регистрацию сообщений в Azure и просмотр их в потоке журналов, однако эти журналы слишком многословны.Я не хочу, чтобы сообщения из категории Microsoft.AspNetCore регистрировались в информационный уровень .Это мой раздел регистрации в appsettings.json файле:

"Logging": {
  "LogLevel": {
    "Default": "Debug",
    "Microsoft.AspNetCore.Hosting.Internal.WebHost": "Debug",
    "GameHub": "Information" 
   }
}

И мой Program класс:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureAppConfiguration((hostingContext, config) => { config.AddJsonFile("appsettings.json", optional:true, reloadOnChange:true); })
            .ConfigureLogging((ctx, logging) =>
                {
                    logging.AddConfiguration(ctx.Configuration.GetSection("Logging"));
                });
}

Он все еще регистрирует сообщения из категории Microsoft.AspNetCore в информацииуровень вместо уровень отладки .

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Как сказал sellotape, уровень лога, установленный в .NET Core, является минимальным уровнем.

Когда вы установите Debug, он будет регистрировать Critical, Error, Warning, Information, Debug уровни.Это будет не log Trace (высшая степень детализации).

Если вы не хотите Information, вы установите его на Warning, тогда вы получите только Critical, Error, Warning logged.

Однако, если вы хотите Critical, Error, Warning, Debug без информации, вы не можете сделать это напрямую с помощью appsettings.json.

public static class Program
{
    public static void Main(string[] args) => CreateWebHostBuilder(args).Build().Run();

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .ConfigureAppConfiguration((hostingContext, config) => { ... })
            .ConfigureLogging((webhostContext, builder) => {
                builder.AddConfiguration(webhostContext.Configuration.GetSection("Logging"))
                .AddFilter<ConsoleLoggerProvider>(logLevel => logLevel!=LogLevel.Information)
                .AddConsole()
                .AddDebug();
            })
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseApplicationInsights();
}

// by strong typedProvider
.AddFilter<ConsoleLoggerProvider>(logLevel => logLevel!=LogLevel.Information)
// or by name
.AddFilter("Console", logLevel => logLevel != LogLevel.Information)
// or generic/global
.AddFilter(logLevel => logLevel != LogLevel.Information)

добавляет фильтр ведения журнала с одним из трех предикатов (Func<string, string, LogLevel, bool>, Func<string, LogLevel, bool>, Func<LogLevel, bool>), как видно из Базовая документация ASP.NET :

Функции фильтра

Функция фильтра вызывается для всех провайдеров и категорий, которым не назначены правила по конфигурации или коду.Код в функции имеет доступ к типу провайдера, категории и уровню журнала.Например:

WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureLogging(logBuilder =>
    {
        logBuilder.AddFilter((provider, category, logLevel) =>
        {
            if (provider == "Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider" && 
                category == "TodoApiSample.Controllers.TodoController")
            {
                return false;
            }
            return true;
        });
    })
    .Build();
0 голосов
/ 24 ноября 2018

Уровень информации выше (или ниже, в зависимости от того, как вы его видите) Уровень отладки и, следовательно, меньше многословно.Если вы установите Debug, вы также получите всю информацию (и предупреждение, ошибка).Я сомневаюсь, что вы можете изменить его в стандартном журнале ядра.


Для справки, уровни журналирования в большинстве каркасов журналов, от большинства до наименее подробных, следующие:

Verbose, Debug,Информация, Предупреждение, Ошибка, Фатальный

(Некоторые платформы используют несколько иное именование, как правильно замечает Ценг в комментариях ниже, но основная идея остается прежней).

В некоторых системах - например,log4net - вы можете установить как максимальные, так и минимальные уровни, но AFAIK с встроенным ведением журнала в Core, вы устанавливаете только минимальные значения и, следовательно, получаете все, что выше этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...