стратегия log4net относительно именованных регистраторов?

Вам необходимо присоединиться к пути,

app.use('/assets', express.static(path.join(__dirname, 'public')))

Для получения дополнительной информации, пожалуйста, обращайтесь: https://expressjs.com/en/starter/static-files.html Вы пытаетесь создать виртуальный путь.

5
задан 2 revs, 2 users 100% 8 May 2012 в 16:17
поделиться

4 ответа

Я в основном использую

public class MyClass
{
    private static readonly ILog log = Log.Get<MyClass>();
}

, где Log.Get - это класс, который в основном делает это внутренне

return LogManager.GetLogger(typeof(T));

Стоимость запуска даже меньше, чем способ отражения, а также более чистый imo.

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

С одной стороны, эта повышенная связь затрудняет тестирование: нет простого способа заменить экземпляр ILog поддельным. С другой стороны, изменения, внесенные в мой класс Log , вызовут колебания во всех классах, которые его используют.

Поэтому я иду по пути внедрения экземпляра ILog , обычно через внедрение конструктора, и передаю на аутсорсинг , как построить регистратор , в мой Выбранная структура DI :

public class MyClass
{
    readonly ILog _log;

    public class MyClass(ILog log)
    {
        _log = log;
    }
}

Это обеспечивает правильную развязку. Коду больше не нужно знать, как устроены регистраторы. Большинство фреймворков внедрения зависимостей имеют средства просмотра вводимого типа и последующего использования его для создания экземпляра журнала. Вот подход для log4net и Autofac .

Большинство фреймворков внедрения зависимостей имеют средства просмотра вводимого типа и последующего использования его для создания экземпляра журнала. Вот подход для log4net и Autofac .

Большинство фреймворков внедрения зависимостей имеют средства просмотра вводимого типа и последующего использования его для создания экземпляра журнала. Вот подход для log4net и Autofac .

11
ответ дан 13 December 2019 в 05:43
поделиться

Стоимость выполнения его, Вашим исходным путем является экземпляр реализации ILog и время, которое требуется для выполнения "Системы. Отражение. MethodBase. GetCurrentMethod ().DeclaringType" при запуске.

Я не забываю изучать его несколько лет назад, и наша стоимость запуска была на порядке 1 секунды в 10 000 классов и меньше чем мегабайте в 10k классы.

Учитывая такую низкую стоимость, я никогда не оглядывался назад, учитывая incredibe гибкость log4net, обеспечивает.

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

метод = новая Система. Диагностика. StackTrace ().GetFrame (1).GetMethod ();

Является дорогим, особенно, если требуется каждое сообщение журнала.

2
ответ дан 13 December 2019 в 05:43
поделиться

В последнее время я создал что-то вроде этого:

public static class Logger
{
    private static bool isLoaded = false;       

    public static ILog Log
    {
        get
        {
            System.Reflection.MethodBase method;
            method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
            StringBuilder loggerName = new StringBuilder();
            loggerName.AppendFormat("{0}.{1}(", method.ReflectedType.FullName, method.Name);

            ParameterInfo[] parameters = method.GetParameters();
            string[] parametersStr = new string[parameters.Length];

            if (parameters.Length > 0)
            {
                for (int i = 0; i < parameters.Length; i++)
                {
                    parametersStr[i] = parameters[i].ToString();
                }
                loggerName.Append(String.Join(", ", parametersStr));
            }

            loggerName.Append(")");

            return GetLogger(loggerName.ToString());
        }
    }


    private static ILog GetLogger(string loggerName)
    {
        if (!isLoaded)
        {
            log4net.Config.XmlConfigurator.Configure();
        }
        return LogManager.GetLogger(loggerName);
    }
}

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

Демонстрационное использование:

Logger.Log.DebugFormat("Response [{0}]", xmlResponse);
-1
ответ дан 13 December 2019 в 05:43
поделиться

Инструмент, который вы можете использовать для ведения журнала, - это PostSharp ( http://www.postsharp.org/ ). Есть платная и бесплатная (Экспресс) версия. Я использовал его только для регистрации границ методов, но я знаю, что вы также можете использовать его для обработки ошибок. Между тем, это позволит удовлетворить большинство ваших потребностей в журналировании без написания кода для каждого класса.

0
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: