Конфигурация и фильтрация логгирования

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 06.11.2019

Для логгера можно задать конфигурацию с помощью одного из следующих источников:

  • Файлы (json, xml)

  • Аргументы командной строки

  • Переменные среды окружения

  • Объекты .NET

  • Незашифрованное хранилище Secret Manager

Также можно создать свой провайдер конфигурации логгера.

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

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Узел "Logging" задает настройки логгирования. Далее узел LogLevel задает минимальный уровень логгирования для трех категорий. Категория Default представляет универсальное применение ко всем категориям. То есть по умолчанию будут логгироваться все сообщения уровня Information. Но для логгера с категорией Microsoft будут логгироваться только сообщения уровня Warning, а для категории "Microsoft.Hosting.Lifetime" - уровня Information.

Мы можем, например, убрать логгирование для категории "Microsoft.Hosting.Lifetime":

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Или установить логгирование связки различных уровней и категорий для различных провайдеров:

{
  "Logging": {
    "Debug": {
      "LogLevel": {
        "Default": "Debug"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning"
      }
    },
    "LogLevel": {
      "Default": "Error"
    }
  },
  "AllowedHosts": "*"
}

Здесь определяются четыре правила. Одно правило определено для провайдера Debug:

"Debug": {
	"LogLevel": {
        "Default": "Debug"
	}
}

То есть для провайдера Debug определено логгирование сообщения уровня Debug для всех категорий.

Для провайдера Console определено два правила:

"Console": {
	"LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning"
	}
}

В данном случае для всех категорий будут логироваться сообщения уровня "Information". Для категории "Microsoft" логируются сообщения уровня "Warning".

И также определено одно общее правило для всех провайдеров:

"LogLevel": {
	"Default": "Error"
}

Логгирование сообщений уровня "Error" для всех категорий.

Следует учитывать, что настройки узла Logging.{ммя_провайдера}.LogLevel переопределяют настройки в узле Logging.LogLevel

Также можно настроить применяемые фильтры с помощью фабрики логгера:

var loggerFactory = LoggerFactory.Create(builder =>
{
	builder.AddDebug();
	builder.AddConsole();
	// настройка фильтров
	builder.AddFilter("System", LogLevel.Debug)
			.AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Trace);
});
ILogger logger = loggerFactory.CreateLogger<Startup>();

Фильтр логгирования задается с помощью метода AddFilter(), который позволяет задать для определенной категории определенный уовень логгирования. Например:

builder.AddFilter("System", LogLevel.Debug)

устанавает для категории "System" уровень LogLevel.Debug для всех провайдеров. Это все равно, если бы мы написали в файле appsettings.json:

"Logging": {
    "LogLevel": {
      "System": "Debug"
}

Второй вызов AddFilter обобщенный - обобщенный класс указывает на провайдер, для которого задается фильтр. То есть для провайдера DebugLoggerProvider для категории "Microsoft" устанавается уровень LogLevel.Trace:

AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Trace);

Этот вызов аналогичен следующему определению в файле конфигурации

"Logging": {
    "Debug": {
      "LogLevel": {
        "Microsoft": "Trace"
	}
}

Можно определять фильтры сразу и в коде C#, и в файле конфигурации. При создании объекта ILogger ILoggerFactory выбирает и применяет одно правило для каждого провайдера. Выбор нужного правило состоит из ряда этапов:

  1. Выбираются все правила, которые соответствуют провайдеру. Если таких правил нет, то выбираются все правила, общие для всех провайдеров.

  2. Из выбранных на предыдущем шаге правил выбирается правило, которое имеет наиболее длинное соответствие имени категории. Если такого нет, то выбираются все правила, общие для всех категорий.

  3. Если на предыдущем шаге выбрано несколько правил, из них выбирается самое последнее (Порядковый номер правила соответствует его порядку определения в файле конфигурации или в коде. Причем правила из файла конфигурации предшествуют правилам, определенным в коде).

  4. Если на предыдущем шаге не выбрано никаких правил, то применяется настройка MinimumLevel. Данную опцию можно опредееленить в коде, например, при настройке фабрики логгера:

    var loggerFactory = LoggerFactory.Create(builder =>
    {
    	builder.AddDebug();
    	builder.AddFilter("System", LogLevel.Debug)
                .SetMinimumLevel(LogLevel.Debug);	// Определение MinimumLevel
                    
    });
    

Для установки базовой конфигурации логгирования в классе Program при создании объекта IWebHostBuilder мы можем вызвать метод ConfigureLogging(). Например, по умолчанию минимальный уровень сообщений представлен константой LogLevel.Information. А это значит, что сообщения, которые относятся к уровням Trace и Debug, будут игнорироваться. Установим в качестве минимального уровня Trace, изменив файл Program.cs следующим образом:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;

namespace HelloApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureLogging(logging => logging.SetMinimumLevel(LogLevel.Trace))
            .Build();
    }
}

После этого в файле Startup мы также сможем использовать логгирование, как раньше, только теперь мы сможем увидеть в логе также и отладочную информацию.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850