Класс синглтон Logger реализуем в отдельной dll, его можно использовать во всём проекте, во всех модулях, как сейчас модно говорить, в каждом микросервисе.
public class Logger
{
static Action? _write;
public static void Write(Log msg) => _write?.Invoke(msg);
static object _lockFlag = new object();
static Logger? _instance;
public static Logger Instance
{
get
{
lock (_lockFlag)
{
if (_instance == null)
_instance = new Logger();
}
return _instance;
}
}
public void Init(Action write)
{
_write = write;
}
}
У метода Write параметр типа Log:
public class Log
{
public int id = 0; // Some ID
public int lvl = 0; // Error level:
// Trace - 0,
// Debug - 1,
// Info - 2,
// Warn - 3,
// Error - 4,
// Fatal - 5
public int type; // Type of message
public string src = ""; // Source
public string msg = ""; // Message
И если хотим использовать Logger в коде, то просто пишем:
Logger.Write(new Log(){lvl = 2, msg = "какое то сообщение"});
Ну или можем заполнить и другие поля типа «id = 1, type = 2».
Кроме того, что Logger – это синглтон со статическим методом Write, здесь ещё интересно то, что сам этот метод никуда ничего не пишет. Он доверяет, можно сказать, делегирует эту задачу некоему методу клиентского модуля.
В клиентском модуле инициализируем Logger, передавая ссылку на рабочий метод, которая сохранится в закрытом поле логгера _write.
void InitializeLogger()
{
Logger.Instance.Init(Ссылка на метод реального логирования);
}
Проект, в котором я начал экспериментировать с таким подходом логирования.
0
Автор публикации
не в сети 2 недели