• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

Гайд NLog - Заводим красивое логирование для нашего приложения

Эксперт
Эксперт
Статус
Оффлайн
Регистрация
16 Ноя 2017
Сообщения
1,601
Реакции
1,261

Предыстория:
Всем привет! Довольно часто при разработке какого либо приложения, возникает необходимость логировать какие либо действия в коде программы.
Конечно, можно банально и просто использовать: Console.WriteLine(); Но просто выводить голый текст - для мелких программ с пару сотен кода - окей, а вот для программы по больше - не очень то удобно. Да и по хорошему надо логировать уровни лога: Информация, Варнинг, Ошибка, Фатальная ошибка и прочее. И писать всё через Console.WriteLine(); или писать обёртку для этого - не совсем хорошая идея, которая к тому-же и сьест ваше время.


Предлагаю в этом туториале познакомиться с библиотекой логирования -
Пожалуйста, авторизуйтесь для просмотра ссылки.

Давайте первым делом создадим C# консольный проект и подключим его через NuGet:
kr4n3JB.png

KMp6TLI.png

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

NLog умеет логировать ваши сообщения в:
Простой файл
В консоль
В Базу данных
Отправляя лог на почту


Мы будем рассказывать про первые 2 способа, которые как раз таки являются самыми популярными типами логирования.
Про логирование в БД вы можете почитать тут:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Не забыв подключить ещё и провайдера (драйвер) базы данных:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Ну а для любителей почты, вот ваш гайд:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Для настройки NLog , прежде всего есть 2 типа его конфигурации:
1) Через конфигурационный файл (NLog.Config)
2) Через код прямо в программе

Так как в интернете полно гайдов, как подключать NLog через первый вариант - я покажу подключение через код прям в программе. Лично для меня второй вариант куда удобнее. Сконфигурировал в main-e, запихнул код в регион и скрыл.

Давайте начнём с простой конфигурации, и потом уже будет её апгрейдить.
Вот код, который позволит вам начать работу с NLog:

C#:
Expand Collapse Copy
            #region NLog Initializator

            var config = new NLog.Config.LoggingConfiguration();
            LogManager.Configuration = new LoggingConfiguration();
            var consoleTarget = new ColoredConsoleTarget("Console Target")
            {
                Layout = @"${longdate}|${level:uppercase=true}|${logger}|${message}"
            };
            // Rules for mapping loggers to targets
            config.AddRule(LogLevel.Trace, LogLevel.Fatal, consoleTarget);
            // Apply config
            NLog.LogManager.Configuration = config;

            #endregion NLog Initializator

Далее создаём сам логгер.
Для этого достаточно инициализировать её внутри класса:

public static Logger Logger = LogManager.GetCurrentClassLogger();

Ну а после всего, можно выводить сообщение:
Logger.Info("Hello world!");

Вот полный код, ready to paste (Вставлять внутрь класса):
Код:
Expand Collapse Copy
public static Logger Logger = LogManager.GetCurrentClassLogger();

        private static void Main(string[] args)
        {
            #region NLog Initializator

            var config = new NLog.Config.LoggingConfiguration();
            LogManager.Configuration = new LoggingConfiguration();
            var consoleTarget = new ColoredConsoleTarget("Console Target")
            {
                Layout = @"${longdate}|${level:uppercase=true}|${logger}|${message}"
            };
            // Rules for mapping loggers to targets
            config.AddRule(LogLevel.Trace, LogLevel.Fatal, consoleTarget);
            // Apply config
            NLog.LogManager.Configuration = config;

            #endregion NLog Initializator

            Logger.Trace("Hello from Gamania!");
            Logger.Debug("Hello from Gamania!");
            Logger.Info("Hello from Gamania!");
            Logger.Warn("Hello from Gamania!");
            Logger.Error("Hello from Gamania!");
            Logger.Fatal("Hello from Gamania!");
        }

Ну а вот и вывод:
UJ7k4UW.png


У NLog есть несколько уровней сообщений (Они пронумерованы от низшего к высшему):

1. Trace
2. Debug
3. Info
4. Warn
5. Error

6. Fatal

Красиво?) А теперь расскажу как можно донастроить наше логирование
Для этого достаточно поменять:
public static Logger Logger = LogManager.GetCurrentClassLogger();
На
public static NLog.Logger Logger = NLog.LogManager.GetLogger("Сюда писать свой текст");
Для этого достаточно добавить данный код (Думаю поменять цвета вы сможете самостоятельно, всё очень просто)
C#:
Expand Collapse Copy
            #region NLog Colors

            var Trace = new ConsoleRowHighlightingRule();
            Trace.Condition = ConditionParser.ParseExpression("level == LogLevel.Trace");
            Trace.ForegroundColor = ConsoleOutputColor.Yellow;
            consoleTarget.RowHighlightingRules.Add(Trace);
            var Debug = new ConsoleRowHighlightingRule();
            Debug.Condition = ConditionParser.ParseExpression("level == LogLevel.Debug");
            Debug.ForegroundColor = ConsoleOutputColor.DarkCyan;
            consoleTarget.RowHighlightingRules.Add(Debug);
            var Info = new ConsoleRowHighlightingRule();
            Info.Condition = ConditionParser.ParseExpression("level == LogLevel.Info");
            Info.ForegroundColor = ConsoleOutputColor.Green;
            consoleTarget.RowHighlightingRules.Add(Info);
            var Warn = new ConsoleRowHighlightingRule();
            Warn.Condition = ConditionParser.ParseExpression("level == LogLevel.Warn");
            Warn.ForegroundColor = ConsoleOutputColor.DarkYellow;
            consoleTarget.RowHighlightingRules.Add(Warn);
            var Error = new ConsoleRowHighlightingRule();
            Error.Condition = ConditionParser.ParseExpression("level == LogLevel.Error");
            Error.ForegroundColor = ConsoleOutputColor.DarkRed;
            consoleTarget.RowHighlightingRules.Add(Error);
            var Fatal = new ConsoleRowHighlightingRule();
            Fatal.Condition = ConditionParser.ParseExpression("level == LogLevel.Fatal");
            Fatal.ForegroundColor = ConsoleOutputColor.Black;
            Fatal.BackgroundColor = ConsoleOutputColor.DarkRed;
            consoleTarget.RowHighlightingRules.Add(Fatal);

            #endregion NLog Colors

pE2BEAI.png
В NLog можно фильтровать по сообщения по их уровню. Например скрыть сообщения типа TRACE и DEBUG, оставив сообщения от INFO и выше.
У нас есть правило:
config.AddRule(LogLevel.Trace, LogLevel.Fatal, consoleTarget);
И тут есть LogLevel.Trace - Это минимальный уровень логирования. Его необходимо поставить на LogLevel.Info.
Тогда у нас логи будут только от Info и выше.
Но можно скрывать не только по минимальному логу, но и по максимальному. Второй аргумент тут как раз кстати.
А вот это всё в действии:
cOIkKnO.png

Очень полезно, если вы делаете программу для дебага и релиза. Можно указать через #if DEBUG и #if RELEASE разные уровни логирования.
Все возможные лэйауты вы можете просмотреть тут:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Сам код шаблона у нас изначально был таким:
Layout = @"${longdate}|${level:uppercase=true}|${logger}|${message}"
Вот мой код:
Layout = @"${counter}|[${date:format=yyyy-MM-dd HH\:mm\:ss}] [${logger}/${uppercase: ${level}}] [THREAD: ${threadid}] >> ${message} ${exception: format=ToString}"
5VpOF4W.png

Особо подсказать нечего. Просто идёте в официальную документацию NLog по Layout-ам, берёте и вставляете что вам нужно. Моего примера вполне достаточно, чтоб понять.
Покажу вам самое простое, базовое логгирование:
1) Добавляем Layout для логгирования в файл:
const string LayoutFile = @"[${date:format=yyyy-MM-dd HH\:mm\:ss}] [${logger}/${uppercase: ${level}}] [THREAD: ${threadid}] >> ${message} ${exception: format=ToString}";
2) Инициализируем файловый логгер:
C#:
Expand Collapse Copy
var logfile = new FileTarget();
            if (!Directory.Exists("logs"))
                Directory.CreateDirectory("logs");
3) Добавляем правило для вывода сообщений в логфайл:
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile);
4) Вставляем этот код:
C#:
Expand Collapse Copy
logfile.CreateDirs = true;
            logfile.FileName = $"logs{Path.DirectorySeparatorChar}lastlog.log";
            logfile.AutoFlush = true;
            logfile.LineEnding = LineEndingMode.CRLF;
            logfile.Layout = LayoutFile;
            logfile.FileNameKind = FilePathKind.Absolute;
            logfile.ConcurrentWrites = false;
            logfile.KeepFileOpen = true;
9A0JQUP.png

Ну вот в принципе и всё. Всё что хотел - рассказал.
А на последок, прикрепляю ссылку на фулл исходный код проекта:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Не стесняйтесь - пишите, будем обсуждать НЛог, кому интересно :)
В будущем буду постить ещё гайды.​
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Годнота подъехала
 
Коротко, ясно, без лишней воды. Спасибо!
 
По факту вообще не нужная библиотека, всё что делает каждый её метод: это задаёт цвет и пишет console.writeLine
 
По факту вообще не нужная библиотека, всё что делает каждый её метод: это задаёт цвет и пишет console.writeLine
Не соглашусь с вами:
Представим ситуацию: У вас крупный проект, например 5000+ строк кода, несколько библиотек и прочее.
У вас стоит цель:
Записывать лог в экран, причём вам надо логгировать несколько уровней
Логгировать лог в файл
А ещё логи посылать на почту.

Что проще? Писать свою обёртку, которая будет логгировать несколько уровней, записывать в файл и отправлять на почту
ИЛИ
Заюзать NLog, в котором всё есть?
 
Не соглашусь с вами:
Представим ситуацию: У вас крупный проект, например 5000+ строк кода, несколько библиотек и прочее.
У вас стоит цель:
Записывать лог в экран, причём вам надо логгировать несколько уровней
Логгировать лог в файл
А ещё логи посылать на почту.

Что проще? Писать свою обёртку, которая будет логгировать несколько уровней, записывать в файл и отправлять на почту
ИЛИ
Заюзать NLog, в котором всё есть?
По факту NLog, но, как мне кажется , библиотека в массы не выйдет, я думаю врятли ктото будет гуглить: как логировать свой проект:)
 
Последнее редактирование модератором:
Так же, для полноты, можно было бы добавить возможность создания собственных стилей, например: дата в конце находится, сообщение в начале и тд
 
Так же, для полноты, можно было бы добавить возможность создания собственных стилей, например: дата в конце находится, сообщение в начале и тд
Так я ведь описал изменение стилей, вот:
1620589827937.png


По факту NLog, но
По факту NLog, но, как мне кажется , библиотека в массы не выйдет, я думаю врятли ктото будет гуглить: как логировать свой проект:)
Ну я с вами не соглашусь, гляньте страницу NLog в GitHub:
Пожалуйста, авторизуйтесь для просмотра ссылки.
1620589858071.png

+ Меня самого научили пользоваться НЛогом, а до этого я не знал о нём так хорошо и юзал свой логгер...
 
Назад
Сверху Снизу