Класс Синглтон 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(Ссылка на метод реального логирования);
}
Проект в котором я начал экспериментировать с таким подходом логирования
nLog