Аргумент 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(). Вы можете использовать регистратор в базовом классе и по-прежнему видеть фактический тип вашего объекта в выводе журналов. Это делает исследования более удобными.