Зачем использовать специализированные библиотеки для логирования?
- Зачем использовать специализированные библиотеки для логирования?
(built-in tools, Serilog, NLog, log4net) - Правильно ли использовать try/catch внутри метода или нужно как-то глобально применять? try/catch использовать в каждом методе?
- Как это работает в NET Framework, NET Core?
- Как это использовать если просто для исследования кода и для рабочего проекта?
Допустим цель: просто исследовать как работает код.
Какие, где значения образуются....
Я могу сделать класс Логер.
Сделать в этом классе метод, который будет принимать несоклько параметров и записывать в csv файл.
Потом этот csv файл в Ексель проанализировать.
Условно код.
public class Program
{
Logger logger = new Logger();
ProductService productService = new ProductService(logger);
}
public class Logger
{
string pathCurrentFileLog = @"logger.csv";
public void LogWriteLine(string messageFull)
{
if (!File.Exists(pathCurrentFileLog))
CreateFileForLogging();
using (StreamWriter sw = new StreamWriter(pathCurrentFileLog, true))
{
DateTime now = DateTime.Now;
string messageLog = now.ToString("yyyy.MM.dd || HH:mm:ss:ffff") + " || " + messageFull; //
sw.WriteLine(messageLog); //++ // 2022-12-15T07:02:43.5857720+03:00
}
}
}
public class ProductService
{
Logger _logger;
public ProductService(Logger logger)
{
_logger = logger;
}
public void CreateProduct()
{
try
{
// код.....
_logger.LogWriteLine("Пройден шаг-1");
// код.....
_logger.LogWriteLine("Пройден шаг-2");
// код.....
int i = 5;
_logger.LogWriteLine($"int i = {i}");
}
catch (Exception ex)
{
_logger.LogWriteLine($"ex.Message -- {ex.Message}");
}
}
public void DeleteProduct()
{
try
{
//Do something
}
catch (Exception ex)
{
_logger.LogWriteLine($"ex.Message -- {ex.Message}");
}
}
}
Заметка
Код
public class MyClass
{
//NLog recommends using a static variable for the logger object
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
//NLog supports several logging levels, including INFO
logger.Info("Hello {0}", "Earth");
try
{
//Do something
}
catch (Exception ex)
{
//Exceptions are typically logged at the ERROR level
logger.Error(ex, "Something bad happened");
}
}
Fatal — used for reporting about errors that are forcing shutdown of the application.
Error — used for logging serious problems occurred during execution of the program.
Warning — used for reporting non-critical unusual behaviour.
Information — used for informative messages highlighting the progress of the application for sysadmins and end users.
Debug — used for debugging messages with extended information about application processing.
Verbose — the noisiest level, used for tracing the code.
Ответы (1 шт):
Начнём с того, что ваш код очень медленный.
Проверка File.Exists - медленная, потому что ненужная.
Отдельное создание файла CreateFileForLogging - медленное, потому что ненужное: конструктор StreamWriter сам создаст файл при его отсутствии.
При каждом вызове вашего метода LogWriteLine файл открывается и закрывается - эти операции чудовищно медленные!
Свойство DateTime.Now - тоже медленное. Лучше используйте DateTime.UtcNow.
Современные сервисы на платформе .NET могут обрабатывать сотни тысяч запросов в секунду! Если в таком сервисе реализовать логирование с помощью вашего кода, то производительность катастрофически упадёт.
Так становится ясна первая причина, зачем использовать специализированные библиотеки для логирования: скорость!
Другая причина.
Вот вы перечислили уровни логирования: Fatal, Error и пр. Используются они в вашем логгере? Нет. Можете вы добавить их использование? Причём, чтобы их можно было задавать и напрямую в коде, и из файла конфига, и динамически менять прямо в процессе выполнения? Наверное, да. Но сколько времени это у вас займёт?
А в готовых библиотеках это уже реализовано. Просто берём и используем.
Ваш логер пишет только в файл в одном формате. Во "взрослых" библиотеках можно писать в файл, консоль, базу данных, облачные хранилища... В самых разных форматах: csv, json, любые произвольные...
Развитые библиотеки позволяют указывать разные места логирования для разных окружений: на машине разработчика - одно (например, консоль), во время тестирования - другое (например, файл), при развёртывании на сервере - третье (БД).
Опять же, всё это можно реализовать вручную, но проще взять готовое решение.
Допустим, пишем в файл. За короткое время его размер может вырасти до гигабайтов. С ним станет неудобно работать.
Нормальные логгеры позволяют задавать ротацию файлов: например, каждый день создаётся новый; каждую неделю удаляются старые файлы и т. п.
И, опять же, всё это можно реализовать вручную. Но проще взять готовую библиотеку логирования.