Аргумент log4net для LogManager.GetLogger


98

Чому більшість прикладів log4net отримують реєстратор для класу, роблячи це:

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

Замість того, щоб просто пройти typeof (MyClass):

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

Чи є якась інша причина для цього, крім того, що перший варіант не вимагає від вас введення конкретного імені класу?

Відповіді:


93

Я думаю, ти маєш причину. Я роблю це так, тому мені не потрібно турбуватися про назву класу, і я можу просто скопіювати та вставити код пластини котла в новий клас.

Для офіційної відповіді дивіться: Як отримати повне кваліфіковане ім’я класу в статичному блоці? на faq log4net


Добре, що це очищає, дякую за це посилання, я цього раніше не бачив
Енді Уайт,

Це стільки років, скільки стає, але подивіться на мою відповідь, якщо ви все-таки вставити це як код котла :)
Noctis,

Ви заощаджуєте невеликий шматочок часу для вирізання та вставлення цього коду. Однак існує вартість виклику "GetCurrentMethod ()" на відміну від використання строкової константи або виклику "typeof ()". Якщо ви додасте, скільки разів це буде викликано протягом життя коду, а скільки часу вам знадобиться набрати ім'я класу, я думаю, ви просто уповільнюєте код, не маючи користі.
Юнаки

1
Ви не сповільнюєтеся так сильно, як ви думаєте, це статичний дзвінок, тому у вас є одне виклик на клас на домен додатка, наприклад, якщо у вас є 300 класів, ви маєте не більше 300 дзвінків до цього протягом усього додатка
Пол Хатчер

Немає сенсу використовувати відображення, щоб отримати ім'я типу, а копія / минуле - це лінь, і ви отримуєте хіт продуктивності, то чому б не отримати просто ім’я ?!
MeTitus

8

Я користувач 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

Як ви кажете - це зручно, оскільки ви можете створити реєстратор методом, не знаючи імені класу (тривіальний я знаю), але дозволяє вирізати та вставити методи між класами, не перейменовуючи виклик.


3

Я думаю, що причина полягає в тому, що ви отримуєте тип типу виконання за допомогою .DeclaringType()методу. Ви можете використовувати реєстратор у базовому класі та все ще бачити фактичний тип вашого об'єкта у висновку журналів. Це робить розслідування набагато сприятливішими.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.