Я в основном использую
public class MyClass
{
private static readonly ILog log = Log.Get<MyClass>();
}
где Log.Get - класс, который в основном делает это внутренне
return LogManager.GetLogger(typeof(T));
Стоимость запуска даже меньше, чем способ отражения, а также более чистый имо.
Обновление: Учитывая мой опыт работы с инжекцией зависимостей, модульным тестированием и подделками в более поздние годы, я уже не могу сказать, что оправдываю изложенный выше подход. Проблема с подходом (и моим, и подходом OP) заключается в том, что в коде есть явные знания о том, как создается экземпляр журнала.
Одна сторона, это увеличенное сцепление усложняет тестирование: нет простого способа заменить экземпляр ILog
на поддельный. С другой стороны, изменения, внесенные в мой класс Log
, приведут к изменениям во всех классах, которые его используют.
Поэтому я иду по пути внедрения экземпляра ILog
, обычно с помощью инжектора конструктора, и передаю , как создать логгер в мою платформу DI на выбор
public class MyClass
{
readonly ILog _log;
public class MyClass(ILog log)
{
_log = log;
}
}
Это позволяет для правильного разделения. Код больше не должен знать, как создаются логгеры. Большинство структур внедрения зависимостей имеют средства просмотра внедряемого типа и последующего использования этого для создания экземпляра журнала. Вот подход для log4net и Autofac .