Аргумент log4net для LogManager.GetLogger
Почему большинство примеров log4net получают логгер для класса, делая это:
private static ILog logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Вместо простого прохождения typeof (MyClass):
private static ILog logger = LogManager.GetLogger(typeof(MyClass));
Есть ли другая причина для этого, помимо того факта, что первый параметр не требует ввода определенного имени класса?
Ответы
Ответ 1
Думаю, у тебя есть причина. Я делаю это так, поэтому мне не нужно беспокоиться о названии класса и просто копировать и вставлять код плиты котла в новый класс.
Для официального ответа см.: Как получить полностью квалифицированное имя класса в статическом блоке? в log4net faq
Ответ 2
Как вы говорите - это удобно, поскольку вы можете создать регистратор в методе, не зная имени класса (тривиально, что я знаю), но позволяет вам вырезать и вставлять методы между классами без переименования вызова.
Ответ 3
Я пользователь NLog, и обычно это сводится к:
var _logger = LogManager.GetCurrentClassLogger();
Казалось немного странным, что вам нужно пройти через отражение в Log4Net, поэтому я посмотрел в исходном коде NLog, и вот, вот что они делают для вас:
[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
string loggerName;
Type declaringType;
int framesToSkip = 1;
do
{
#if SILVERLIGHT
StackFrame frame = new StackTrace().GetFrame(framesToSkip);
#else
StackFrame frame = new StackFrame(framesToSkip, false);
#endif
var method = frame.GetMethod();
declaringType = method.DeclaringType;
if (declaringType == null)
{
loggerName = method.Name;
break;
}
framesToSkip++;
loggerName = declaringType.FullName;
} while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
return globalFactory.GetLogger(loggerName);
}
Я думаю, что я бы написал что-то подобное для Log4Net как расширение или статический метод вместо вставки отражения в качестве части кода котла:)
Ответ 4
Я думаю, причина в том, что вы получаете тип типа времени выполнения с помощью метода .DeclaringType()
. Вы можете использовать регистратор в базовом классе и по-прежнему видеть фактический тип вашего объекта в выводе журналов. Это делает исследования более удобными.