Аргумент log4net для LogManager.GetLogger - PullRequest
97 голосов
/ 25 марта 2009

Почему большинство примеров log4net получают регистратор для класса, выполняя это:

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Вместо того, чтобы просто передавать typeof (MyClass):

private static ILog logger = LogManager.GetLogger(typeof(MyClass));

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

Ответы [ 4 ]

92 голосов
/ 25 марта 2009

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

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

7 голосов
/ 19 сентября 2014

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

7 голосов
/ 25 марта 2009

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

3 голосов
/ 24 августа 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...