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

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

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

  • Файлы (json, xml)

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

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

  • Объекты .NET

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

using Microsoft.Extensions.Logging.Debug;
//....................

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

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

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

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

"Logging": {
    "LogLevel": {
      "System": "Information"
}

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

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

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

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

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

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

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

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

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

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

Глобальная настройка логгирования

Для глобальной установки настроек логгирования у объекта WebApplicationBuilder определено свойсво Logging, которое представляет тип ILogingBuilder. Для управления логгирования он предоставляет ряд методов:

  • AddConfiguration(): добавляет конфигурацию логгера в виде объекта IConfiguration

  • AddConsole(): добавляет консольный логгер

  • AddConsoleFormatter(): добавляет объект форматирования для консольного вывода

  • AddJsonConsole(): добавляет форматирование сообщений консольного логгера в формат "json"

  • AddSimpleConsole(): добавляет простое форматирование для логгирования на консоль

  • AddDebug(): добавляет логгер отладки

  • AddEventLog(): добавляет логгер для вывод в журнал Windows Event Log

  • AddEventSourceLogger(): добавляет логгер для вывода в лог Event Tracing for Windows

  • AddFilter(): добавляет фильтрацию для сообщений логгера

  • AddProvider(): добавляет провайдер логгирования

  • ClearProviders(): удаляет все зарегистрированные провайдеры логгирования

  • SetMinimumLevel(): устанавливает минимальный уровень логгирования

Например:

var builder = WebApplication.CreateBuilder();
builder.Logging.ClearProviders();	// удаляем все провайдеры
builder.Logging.AddConsole();	// добавляем провайдер для логгирования на консоль
var app = builder.Build();
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850