аргумент 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));

есть ли другая причина для этого, кроме того, что первый вариант не требует ввода определенного имени класса?

4 94

4 ответа:

Я думаю, что у тебя есть причина. Я делаю это таким образом, чтобы мне не нужно было беспокоиться о имени класса и можно было просто скопировать и вставить код котельной плиты в новый класс.

официальный ответ см. В разделе: Как получить полное имя класса в статическом блоке? на log4net faq

Как вы говорите-это удобно, поскольку вы можете создать регистратор в методе, не зная имени класса (тривиальный я знаю), но позволяет вырезать и вставлять методы между классами без необходимости переименовывать вызов.

Я пользователь 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 как расширение или статический метод вместо вставки отражения как часть моего кода котла :)

Я думаю, причина в том, что вы получаете тип типа времени выполнения с помощью .DeclaringType() метод. Вы можете использовать регистратор в базовом классе и по-прежнему видеть фактический тип вашего объекта в выходных данных регистраторов. Это делает расследование гораздо более удобным.