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

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


person Andy White    schedule 25.03.2009    source источник


Ответы (5)


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

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

person Steven Lyons    schedule 25.03.2009
comment
Хорошо, это проясняет, спасибо за ссылку, я этого раньше не видел - person Andy White; 25.03.2009
comment
Это настолько стара, насколько возможно, но взгляните на мой ответ, если вы все еще вставляете его как код котла :) - person Noctis; 19.09.2014
comment
Вы сэкономите немного времени разработчика, вырезая и вставив этот код. Однако вызов ‘GetCurrentMethod ()’ требует дополнительных затрат, в отличие от использования строковой константы или вызова ‘typeof ()’. Если вы сложите, сколько раз это будет вызываться за время жизни кода, против того, сколько времени вам понадобится, чтобы ввести имя класса, я думаю, что вы просто замедляете свой код с небольшой пользой. - person Youngs; 03.02.2015
comment
Вы не замедляетесь так сильно, как думаете, это статический вызов, поэтому у вас есть один вызов для каждого класса для каждого домена приложения, например. если у вас 300 классов, у вас будет не более 300 обращений к этому за все время существования вашего приложения. - person Paul Hatcher; 05.09.2015
comment
Нет смысла использовать отражение для получения имени типа, а копирование / прошлое - это лень, и вы получаете удар производительности, так почему бы не получить просто имя ?! - person MeTitus; 09.04.2017

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

person Noctis    schedule 19.09.2014

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

person Preet Sangha    schedule 25.03.2009

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

person PeterB    schedule 24.08.2014

Это также упрощает создание шаблонов Codesmith для целей генерации кода.

person Phillip H. Blanton    schedule 01.06.2020