Содержание
Логирование (ведение логов, журналирование) — это процесс записи наиболее значимой информации о работе системы с возможностью быстрого доступа к этой информацией в случае необходимости. В случае необходимости лог может подсказать нам в какой чисти системы возникла проблема или же деть информацию о конфигурации, действиях пользователя и так далее.
ASP.NET Core имеет встроенную поддержку логирования, что позволяет нам с минимальными издержками вести логи, в большинстве случаев, без создания своих сервисов. Для логирования данных в ASP.NET Core используются объекты, реализующие интерфейс ILogger<T>
.
Пример лога
С логированием в ASP.NET Core мы сталкиваемся с самого первого приложения. Если вы запустите приложение и откроете консоль, то первое, что вы там увидите — это информационные сообщения об основных настройках системы:
Здесь нам сообщается о том, по каким адресам доступно наше приложение, о том, что приложение запущено и как его остановить, наименование среды окружения и путь к папке с содержимым приложения.
ASP.NET Core выводит эти сообщения, используя штатный сервис логирования, который мы можем получить через механизм внедрения зависимостей или же, используя свойство Logger
объекта WebApplication
. Рассмотрим оба этих варианта.
Использование свойства Logger объекта WebApplication
Создадим новое приложение ASP.NET Core с шаблоном Empty и напишем такой компонент middleware:
public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.Use(async (context, next) => { app.Logger.LogInformation("Путь запроса {0}", new string[]{ context.Request.Path}); await next(); }); app.MapGet("/", () => "Hello World!"); app.Run(); } }
здесь мы, используя свойство Logger
выводим в консоль приложения информацию о пути запроса:
app.Logger.LogInformation("Путь запроса {0}", new string[]{ context.Request.Path});
и, если запустить приложение, то можно получить интересную информацию о работе нашего приложения в браузере:
Мы выполняем одно действие — загружается главная страница приложения (в логе — это путь «/
«). Фактически же выполняется два запроса: первый — наш, второй — браузер запрашивает favicon сайта (о чем говорит вторая строка лога). Такое поведение характерно для браузера Edge, Chrome, Яндекс.Браузера и т.д.
Получение сервиса логирования через механизм DI
Перепишем наше приложение и вместо компонента middleware создадим конечную точку для которой запросим штатный сервис логирования:
app.MapGet("/", (ILogger<Program> logger) => { logger.LogInformation($"Время доступа: {DateTime.Now}"); return "Hello world"; });
Здесь мы запрашиваем логгер с категорией Program. В приложении запись лога будет следующей
И здесь мы подходим к следующему вопросу — категория логгера.
Категория логгера
В качестве категории логгера в ASP.NET Core выступает название класса, в котором используется логгер. Например, в примере выше мы использовали логгер в классе Program и, соответственно, через механизм DI запрашивали сервис логирования:
app.MapGet("/", (ILogger<Program> logger) =>
Использование категорий позволяет сделать лог более информативным — по названию категории логгера сразу становится понятным из какого класса пришло сообщение.
Уровни логирирования
В ASP.NET Core могут применяться различные уровни логирования, содержащиеся в перечислении LogLevel
, Тот или иной уровень логирования может применяться в зависимости от серьезности сообщения. Всего выделяется семь уровней логирования и для шести из которых предусмотрены соответствующие методы:
LogLevel | Значение | Метод ILogger | Описание |
---|---|---|---|
Trace |
0 | LogTrace |
Содержат наиболее подробные сообщения. Эти сообщения могут содержать конфиденциальные данные приложения, информацию о настройках системы и т.д.. Сообщения такого уровня не должны включаться в логи опубликованного приложения, но могут быть ценны для отладки. |
Debug |
1 | LogDebug |
Информация для отладки и разработки. |
Information |
2 | LogInformation |
Информация, позволяющая отследить поток приложения (примеры см. выше). |
Warning |
3 | LogWarning |
На случай ненормальных или неожиданных событий. Обычно включает ошибки или условия, которые не приводят к сбою приложения, но могут иметь серьезные последствия для работы приложения в будущем. |
Error |
4 | LogError |
Используется для вывода информации об ошибках и исключениях, которые невозможно обработать. Эти сообщения указывают на сбой в текущей операции или запросе, а не на сбой всего приложения. |
Critical |
5 | LogCritical |
При сбоях, требующих немедленного внимания. Примеры: потеря данных, нехватка места на диске |
None |
6 | Указывает, что сообщение не должно выводится в лог приложения. |
Каждый метод из таблицы выше имеет несколько перегрузок, которые могут принимать различное количество параметров, а именно:
string data
— сообщение для логаint eventId
— числовой идентификатор, который связан с логом.string format
— сообщения для лога, которое может содержать параметрыobject[] args
— набор параметров для строкового сообщения (если используется версия метода с параметромstring format
)Exception error
— логгируемый объект исключения.
Также, у ILogger
определен универсальный метод, с помощью которого можно выводить сообщения любого уровня — Log()
. Например,
logger.Log(LogLevel.Information, "Информация для размышления");
Для каждого уровня логирования предусмотрена своя текстовая метка, которая позволяет быстро определить соответствующий уровень. Вот как выглядят метки для различных уровней логирования:
По умолчанию, сообщения уровней
Trace
и Debug
отключены в ASP.NET Core и для из включения необходима настройка логирования о которой мы поговорим в следующей части.
Итого
Логирование (ведение логов, журналирование) — это процесс записи наиболее значимой информации о работе системы с возможностью быстрого доступа к этой информацией в случае необходимости. ASP.NET Core позволяет логировать информацию о работе приложения сразу после запуска, используя штатный сервис логирования — Logger
, который мы можем запрашивать через механизм внедрения зависимостей или же использовать свойство Logger
объекта WebApplication
. Для информативности логов в ASP.NET Core применяются различные уровни и категории логирования.