C# Подключаем NLog в наш проект RageMp

  • Автор темы Автор темы Designed
  • Дата начала Дата начала
Начиная разрабатывать проект мы с вами сталкиваемся с надобностью отслеживания логики поведения нашего проекта, существует много вариантов как это сделать, но сегодня мы остановимся на довольно крутом инструменте NLog. Зачем разрабатывать свой велосипед, если все давно сделали за вас? ;)

Если вы незнакомы с NuGet, прошу почитать пару статей: Что такое NuGet и Как импортировать пакеты NuGet в ваш проект

Первое то что нам необходимо сделать, это подключить наш NuGet пакет NLog и его дополнительные пакеты (NLog.Schema и NLog.Config).
Далее мы переходим к настройке, для этого перейдем в NLog.config.

NLog.config

Конфиг необходим для настройки поведения логов, какие логи будут записываться и куда они будут записываться.
Содержимое конфига разбито на блоки, мы будет работать с блоком Targets и Rules.

Targets

Цели, куда и в каком формате будет записан лог.
В этом блоке мы создаем точку записи, разберем все по отдельности.

Type - куда будет записываться лог. Список всех типов.
Name - Имя для цели.
Остальные параметры описываются в зависимости от Type. Их можно найти в списке всех типов, ссылка выше.

Пример записи лога в файл, где {basedir} это директория в которой находится ваша программа, {shortdate} означает дату в коротком формате.
XML:
<!--
      Данная цель сохраняет лог в файл вида logs\2018-04-20.log
      вид сообщения: 2018-04-20 12:27:05.9121 DEBUG debug message
-->
<target xsi:type="File" name="filedata" fileName="${basedir}/logs/${shortdate}.log"
                  layout="${longdate} ${uppercase:${level}} ${message}" />

Rules​

Правила, исходя из чего будет записан тот или иной лог.
Ну здесь я разберу очень простой пример.

Name - имя правила, НЕ цели.
Minlevel - минимальный уровень логирования который будет записываться для цели.
WriteTo - название цели к которому относится правило.

XML:
<rules>
  <logger name="*" minlevel="Warn" writeTo="target1" />
</rules>

Объявление​

Чтобы объявить логер нам необходимо написать:
C#:
private Logger logger = LogManager.GetCurrentClassLogger();
Именно так рекомендуется объявлять логер в вашем классе.

Уровни логирования​

C#:
Logger logger = LogManager.GetCurrentClassLogger(); // Чтобы было к чему обращаться
log.Trace("trace message"); // Для пошаговой отладки (самый маленький уровень логирования)
log.Debug("debug message"); // Для стандартной отладки
log.Info("info message"); // Информационные сообщения
log.Warn("warn message"); // Предупреждение, еще не ошибка, но нужно решать проблему
log.Error("error message"); // Ошибка, но программа продолжает работать, требует незамедлительного исправления
log.Fatal("fatal message"); // Фатальная ошибка, программа продолжать работу корректно не может

Код:
2021-05-22 12:21:46.1380 | TRACE | NLogUnderstanding.Program | trace message
2021-05-22 12:21:46.1380 | DEBUG | NLogUnderstanding.Program | debug message
2021-05-22 12:21:46.1380 | INFO | NLogUnderstanding.Program | info message
2021-05-22 12:21:46.1380 | WARN | NLogUnderstanding.Program | warn message
2021-05-22 12:21:46.1380 | ERROR | NLogUnderstanding.Program | error message
2021-05-22 12:21:46.1381 | FATAL | NLogUnderstanding.Program | fatal message

Больше информации на GitHub
Да, очень кратко, но буду смотреть на вопросы и дополнять статью.
 
Спасибо за туториал! Крутая библиотека. А она умеет делать ротацию логов?
 
Спасибо за туториал! Крутая библиотека. А она умеет делать ротацию логов?
Ну если я правильно понял вопрос, то для каждого типа (запись в файл, в базу) она реализуется по разному. Например если работать с файлами, то есть специальные артибуты.

deleteOldFileOnStartup - Удаляет старые логи после перезапуска приложения
archiveAboveSize - если размер больше указанного значения в байтах, то автоматически архивируем.
maxArchiveFiles - если кол-во архивированных логов становится больше чем указанно, то самые старые логи автоматически удаляются.
maxArchiveDays - если архивированные логи хранятся больше N указанных дней, то они автоматом чистятся.

Там много атрибутов разных
 
Да, то что надо. Для логгера это крутая фича.
А то в один прекрасный момент можно обнаружить что логи забили все место на сервере :)
 
Да, то что надо. Для логгера это крутая фича.
А то в один прекрасный момент можно обнаружить что логи забили все место на сервере :)
Обычно ж сторонним утилитам ротацию делают, условным logrotate на линухе, а либа для логов чисто шоб писать
Ну это так, вдруг ты решение ищешь, лучше использовать специализированное что-то
 
Обычно ж сторонним утилитам ротацию делают, условным logrotate на линухе, а либа для логов чисто шоб писать
Ну это так, вдруг ты решение ищешь, лучше использовать специализированное что-то
Согласен, в linux это легко настраивается. Но например если ты просто арендуешь сервак на хостинге, то у тебя скорее всего не будет доступа к этим утилитам. В таком случае будет полезно, если логгер сам умеет делать rotate ;)
 
А в целом конечно я тоже за unix-way. Каждая программа должна делать только что-то одно и делать это хорошо. Логгер - писать логи, logrotate - делать ротацию логов и т. д.
 
Согласен, в linux это легко настраивается. Но например если ты просто арендуешь сервак на хостинге, то у тебя скорее всего не будет доступа к этим утилитам. В таком случае будет полезно, если логгер сам умеет делать rotate ;)
Да мужики вы че какие хостинги в 2021, каждый увОжающий себя программест должен иметь навыки девопса и спокойно настраивать VDS'ки под себя :D
 
Да мужики вы че какие хостинги в 2021, каждый увОжающий себя программест должен иметь навыки девопса и спокойно настраивать VDS'ки под себя :D
Ну это в идеальном мире)) Все-таки в рейдже больше начинающих программистов. Да и во взрослой коммерческой разработке далеко не все шарят в этом.
 
Назад
Верх