На каком этапе вы добавляете логирование и трассировку в OO? - PullRequest
6 голосов
/ 28 июня 2009

Мне интересно, на каком этапе разработки вы добавляете ведение журнала и / или трассировку в свои приложения?

Я работаю со стеком .Net и log4net (через commons.logging). Обычно, используя подход TDD к разработке, хотя, по общему признанию, и не на 100%, иногда я знаю, что это можно сделать без покрытия тестами. Все мои приложения находятся на стороне сервера, например веб-службы, службы Windows, которые принимают сообщения с шины, asp.net mvc приложения для бизнес-администрирования. и т.д ..

Я обнаружил, что украшаю методы в своих службах приложений с помощью описательного логгера. ИНФО "Получение тортов из репозитория". некоторая работа ... "Получил 5 тортов из хранилища.", а затем необработанный обработчик исключений для приложения doamin to logger.FATAL для неожиданных исключений, которые всплывают.

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

Для трассировки, которая включена через config, я думаю о перехвате вызовов методов и создании экземпляров с использованием инфраструктуры IOC, и это должно позаботиться об устранении неполадок на месте, а не о большой заполненности трассировки.

Ответы [ 4 ]

2 голосов
/ 28 июня 2009

Мое программное обеспечение находится в слоях, с четко определенным API между слоями. Я стремлюсь реализовать ведение журнала для этих API с самого начала, чтобы для любой конкретной транзакции я мог видеть, как это приводит к вызову API на каждом из нижележащих уровней: если есть ошибка, это поможет сузить ее до конкретного слой. Ведение журнала также поможет воспроизвести проблему, показывая журнал всех предыдущих, нормальных действий, которые привели к проблеме.

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

Файл журнала, следовательно, часто показывает последовательность обращений к общедоступным API с сообщением об ошибке, сгенерированным изнутри: этого достаточно для диагностики проблемы.

Кроме того, я добавляю протоколирование на уровне отладки по мере необходимости: для устранения конкретных проблем во время разработки и / или после выпуска.

Мое объяснение заботы о ведении журнала частично объясняется следующим:

Чтобы исправить любую ошибку в выпущенном программном обеспечении, я зависим от файла журнала; и то же самое также часто относится к программному обеспечению в процессе его разработки.


Вы сказали,

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

Я сказал,

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

Думаю, мне лучше объяснить, что я имею в виду под "слоями", которые могут совпадать или не совпадать с вашими классами "более низкого уровня".

Например, моя система может иметь следующие слои:

  • UI
  • Бизнес-уровень (правила работы с данными)
  • Уровень доступа к данным (для ввода-вывода базы данных)
  • База данных

В этом случае у меня будут следующие интерфейсы или API, которые могут заслуживать регистрации:

  • Между пользователем и пользовательским интерфейсом (т. Е. События пользовательского интерфейса, мышь и клавиатура)
  • Между пользовательским интерфейсом и бизнес-уровнем (см. «Диалоговое окно смирения»)
  • Между бизнес-уровнем и DAL
  • Между DAL и базой данных

В качестве альтернативы система может представлять собой цепочку компонентов, соединяющих две равноправные конечные точки (менее очевидно, с «верхним» и «нижним» слоями).

В любом случае я регистрирую API-интерфейс, являющийся общедоступным фасадом каждого компонента, который удобен для регистрации по нескольким причинам:

  • Не слишком сложно (фасад обычно проще, чем базовая / внутренняя реализация)
  • Хорошее покрытие (если я регистрирую весь фасад, и если единственный путь к компоненту - через его фасад, то я знаю, что я зарегистрировал все, что входит в компонент)
  • Хорошо работает с Законом Конвея : при отладке системы с несколькими компонентами, каждый из которых разрабатывается другой группой, один из повторяющихся вопросов звучит так: «Какой компонент неисправен, и, следовательно, какая группа должна отладить? "
1 голос
/ 28 июня 2009

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

1 голос
/ 28 июня 2009

Регистрация и отслеживание должны быть сквозными проблемами. Вы можете добавлять / удалять их в любое время декларативным способом, если вы используете аспектно-ориентированное программирование.

0 голосов
/ 28 июня 2009

Я бы не сказал, что «Получение тортов из хранилища» лучше всего подходит для INFO. Это больше подходит для DEBUG или даже TRACE. Обычно вы хотите использовать INFO для регистрации функциональных вещей, например, Msgstr "Для пользователя А не осталось тортов". Нефункциональный материал и технический поток должны быть с меньшей степенью серьезности ИМХО. Я бы не стал использовать FATAL для регистрации исключений, если только вы не дойдете до того момента, когда приложение полностью прекратит работу ... было бы очень сложно увидеть FATAL, а затем система все еще жива и работает. ОШИБКА - лучший выбор, иногда даже ПРЕДУПРЕЖДЕНИЕ, зависит от того, насколько плохим является исключение. Что касается перехватчиков AOP, в прошлый раз я проверил - эти вещи сильно влияют на производительность. Это крутая и сексуальная концепция, но в моем случае она не была практичной, я не уверен, что она выходит за рамки демонстраций и тривиальных примеров из книг и статей, объясняющих преимущества АОП. Итак, я бы перепроверил, прежде чем полностью положиться на него.

...