Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Код можно инструментировать для создания журнала, который служит записью интересных событий, произошедших во время выполнения программы. Чтобы понять поведение приложения, можно просмотреть журналы. .NET с течением времени накопил несколько различных API для ведения журналов, и эта статья поможет вам понять, какие варианты доступны.
Примечание.
Иногда ведение журнала также называют трассировкой, особенно в некоторых старых API Windows и .NET. В последние годы "трассировка" чаще используется как сокращение для распределенной трассировки, но в этой статье это означает другое.
API ведения журнала .NET
ILogger
В большинстве случаев, независимо от того, следует ли добавлять ведение журнала в существующий проект или создавать новый проект, инфраструктура ILogger является хорошим выбором по умолчанию.
ILogger поддерживает быстрое структурированное ведение журнала, гибкую конфигурацию и коллекцию распространенных приемников , включая консоль, которая отображается при запуске приложения ASP.NET. Кроме того, ILogger интерфейс также может служить в качестве фасада для многих сторонних реализаций логирования, которые предлагают широкие функциональные возможности и расширяемость.
ILogger предоставляет возможности ведения журналов для реализации OpenTelemetry для .NET, позволяя выгружать журналы из вашего приложения в различные системы APM для дальнейшего анализа.
ИсточникСобытий
EventSource — это более старый высокопроизводительный API с структурированным ведением журнала. Изначально он был разработан для хорошей интеграции с трассировкой событий для Windows (ETW), но позже был расширен для поддержки кроссплатформенной трассировки EventPipe и EventListener для кастомных приемников. По сравнению с ILogger, EventSource имеет относительно мало предварительно созданных приемников ведения журнала и не поддерживает встроенную поддержку настройки с помощью отдельных файлов конфигурации.
EventSource отлично подходит, если требуется более жесткий контроль над интеграцией ETW или EventPipe , но для ведения журнала ILogger общего назначения более гибкий и удобный для использования.
Трассировка
System.Diagnostics.Trace и System.Diagnostics.Debug — это старейшие API ведения журнала в .NET. Эти классы имеют гибкие конфигурации API и широкую экосистему приемников данных, но поддерживают лишь неструктурированное ведение журнала. В платформа .NET Framework их можно настроить с помощью файла app.config, но в .NET Core нет встроенного механизма конфигурации на основе файлов. Обычно они используются для создания диагностических выходных данных для разработчика, выполняясь под отладчиком. Команда .NET продолжает поддерживать эти API для обеспечения обратной совместимости, но новые функции не будут добавлены. Эти API являются прекрасным выбором для приложений, которые уже используют их. Для новых приложений, которые еще не выбрали API ведения журнала, ILogger может предложить лучшие функциональные возможности.
Специализированные API ведения журнала
Консоль
Класс System.Console имеет методы Write и WriteLine, которые можно использовать в простых сценариях ведения журнала. Начать работать с этими API очень легко, но решение не будет столь гибким, как один API ведения журнала общего назначения. Консоль разрешает только неструктурированное ведение журнала и не поддерживает настройку для выбора включаемых сообщений журнала или перенаправления на другой приемник. Использование API ILogger или Trace с приемником консоли не занимает много дополнительных усилий и позволяет настроить ведение журнала.
DiagnosticSource
System.Diagnostics.DiagnosticSource предназначен для ведения журнала, в котором сообщения журнала будут анализироваться синхронно в процессе, а не сериализуются в любое хранилище. Это позволяет источнику и прослушивателю обмениваться произвольными объектами .NET в виде сообщений, в то время как большинство API ведения журнала требуют сериализации события журнала. Этот метод также может быть очень быстрым, обрабатывая лог-события в десятках наносекунд, если прослушиватель эффективно реализован. Средства, использующие эти API, часто действуют как профилировщики в процессе, хотя API не накладывает никаких ограничений.
EventLog
System.Diagnostics.EventLog — это только API Windows, который записывает сообщения в журнал событий Windows. Во многих случаях использование ILogger с необязательным модулем EventLog при работе на Windows может обеспечить аналогичную функциональность без плотной привязки приложения к ОС Windows.
Терминология ведения журнала
Структурированное и неструктурированное логирование
Ведение журнала может быть структурировано или неструктурировано:
- Неструктурированные: записи журнала кодируются как свободный текст, который люди могут читать, но трудно программно анализировать и запрашивать.
- Структурировано: записи журнала имеют четко определенную схему и могут быть закодированы в разных двоичных и текстовых форматах. Эти журналы предназначены для машинного перевода и запроса, чтобы и люди, и автоматизированные системы могли работать с ними легко.
Хорошие структурированные API ведения журнала могут предложить больше функциональных возможностей и производительности с небольшим увеличением сложности использования.
Ресиверы
Большинство API логирования позволяют отправлять сообщения журнала к различным получателям, называемым приемниками. Некоторые API имеют большое количество предварительно созданных приемников, в то время как другие имеют только несколько. Если не существует предварительно созданного приемника, обычно существует API расширяемости, который позволит создавать пользовательский приемник, хотя это требует написания немного большего кода.