Синглтон-паттерн - это анти-паттерн ; Я не могу вспомнить многих случаев, когда его следует использовать или рекомендовать, в том числе в этом случае для ведения журнала.
Как мы работаем с журналированием: Экземпляр журналирования внедряется во все классы, которым это необходимо, с помощью инжектора конструктора. Например:
public class MyClass
{
private readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public void DoStuff()
{
_logger.Trace("DoStuff called");
}
}
Введенный экземпляр журнала может быть либо новым экземпляром каждый раз, либо, если вы хотите иметь единый экземпляр журнала, его можно создать один раз и пропустить при необходимости.
Однако: я настоятельно рекомендую первый вариант, используя DI для построения ваших классов с использованием шаблона Composition Root . Я также рекомендую использовать каркас журналирования, такой как NLog или log4net. Это настраиваемые и простые в использовании электронные письма, средства просмотра событий, файлы и т. Д. и работают в многопоточных средах.
У нас есть собственное определение ILogger, в котором есть Trace, Warn, Info, Exception и т. Д., А затем реализован этот интерфейс с использованием NLog. Это означает, что мы можем легко изменить способ регистрации, создав новую реализацию ILogger, а затем выполнив простое обновление конфигурации DI. Это одно решение для ведения журнала, которое до сих пор работало для нас очень хорошо.