Практически все крупные приложения нуждаются в журналировании всех действий и ошибок программы, чтобы при возникновении каких-либо падений программы у пользователей, оперативно исправлять недочеты. Реализация собственных библиотек не занимает большого количества времени. Но данные решения будут малофункциональными и могут быть недотестированными. Поэтому разработчики используют готовые решения по управлению и записи логов во время работы программы. Плюсы использования подобных решений заключается в том, что они являются более универсальными, т.к. должны работать с любым кодом и иметь возможность сохранять записи в различных форматах (от простой записи в консоль до записи результатов в базу данных). Вторым плюсом можно выделить то, что готовые библиотеки многократно протестированы пользователями (другими разработчиками) и имеют меньший шанс отрицательно повлиять на программу, путем вылета приложения. В данной статье представлен обзор трех наиболее популярных библиотек логирования: Log4Net, SeriLog, NLog. Открытый исходный код: https://github.com/apache/logging-log4net Лицензия: Apache-2.0 license Официальный сайт: https://logging.apache.org/  Документация: https://logging.apache.org/log4net/ В данной библиотеке можно реализовывать поименные логгеры, т.е. можно получить собственный экземпляр логгера по типу класса или строковому ключу, использую статический класс LogManager. Для установки настроек логгера нужно создать файл конфигурации (подробный гайд по файлам конфигурации по ссылке). Пример: Паттерны отображения сообщения логов можно удобно собирать, используя следующую таблицу. Также в файл конфигурации можно добавлять различные фильтры. Для этого нужно в конфиг лога добавить подобный блок: Пример: Другие фильтры представлены по ссылке. Также в логгер можно помещать дополнительные модули (плагины), которые добавляют дополнительную возможность, например, удаленную запись логов на сервер. Подробнее о плагинах можно прочитать по ссылке. Данная библиотека (как и все далее перечисленные) может устанавливать уровни сообщений от Debug до Fatal. Открытый исходный код: https://github.com/serilog/serilog Лицензия: Apache-2.0 license Официальный сайт: https://logging.apache.org/  Документация: https://github.com/serilog/serilog/wiki Данная библиотека изначально не имеет настройки путем изменения файлов конфигурации. Это влечет следующее неудобство – нельзя оперативно поменять конфигурацию для получения более подробных сведений у программы.  Пример создания логгера: Для добавления возможности управления настройками логгера путем изменения конфигурации можно при установке пакета Serilog.Settings.AppSettings (подробный гайд по ссылке). Также у данной библиотеки есть статическое свойство Logger класса Log, в которое помещается объект логгера. При записи логов в строку можно добавлять операторы, которые помогают выводить значения объектов и простых структур.  Пример ввода сообщения: Оператор @ перед SensorInput инструктирует Serilog сохранять структуру переданного объекта. Если данный оператор опущен, Serilog распознает простые типы, такие как строки, числа, даты и время, словари и перечисления; все остальные объекты преобразуются в строки с помощью ToString(). «Структурирование» (вывод типа объекта) может быть принудительно выполнено с помощью оператора $ вместо @: В результате выведет: Сегмент :000, следующий за TimeMS, представляет собой строку стандартного формата .NET, которая влияет на то, как свойство отображается (а не на то, как оно захватывается). Стандартный приемник консоли, включенный в Serilog, отобразит приведенное выше сообщение как: При конфигурации логгера можно устанавливать правила для каждого типа вывода сообщений. Например, можно установить значение перезаписи файла в определенный промежуток времени:  Или устанавливать формат вывода: Также есть возможность устанавливать как общий минимальный уровень вывода логов, так и для каждого отдельного типа вывода сообщений: В библиотеке Serilog можно добавлять фильтры для записей логов.  Пример: Для каждой записи будет проверяться свойство Count, если оно удовлетворяет условию, то произведётся запись. Также Serilog поддерживает подлоги, т.е. в основной объект класса лога можно поместить другой способ вывода лога, в котором можно определить свои правила, фильтры и обвертки (sink).  Пример: Serilog позволяет динамически изменять уровень логирования, путем использования класса LoggingLevelSwitch: В дальнейшем можно будет изменять объект levelSwitch для вывода нужного уровня. Открытый исходный код: https://github.com/NLog/NLog Лицензия: BSD-3-Clause license Официальный сайт: https://nlog-project.org/ Документация: https://github.com/nlog/nlog/wiki Данная библиотека позволяет создавать объекты логов двумя способами: через код и через файл конфиг Пример: Подробнее о файлах конфигурации логов по ссылке. Пример создание объекта через код: Подробнее о конфигурации в коде по ссылке Формат вывода сообщений можно устанавливать путем добавления в target элемент layout: Данная библиотека поддерживает следующие структурные форматы: CsvLayout JsonLayout XmlLayout Формат в файле конфигурации будет выглядеть следующим образом: NLog содержит в себе такие операторы для формирования строк, как и Serilog. Библиотека содержит асинхронную обертку, что позволяет логировать несколько потоков в одном объекте логгера. NLog позволяет создавать переменные внутри файла конфигурации, которые могут использоваться в последующих частях конфигурации: Основные возможности ранее перечисленных библиотек малоотличимы. Чтобы выбрать решение, нужно углубиться в возможности данных библиотек. Автором было дано предпочтение библиотеке NLog. Данная библиотека уже содержит асинхронную обертку, что позволяет логировать многопоточные приложения. Следующим преимуществом стала изначальная возможность измения настройки логгера через файл конфигурации. Последним приемуществом, почему автор отдает предпочтение библиотеки NLog – возможность создавать переменные в файлах конфигурации логгера.