По мере того, как мои текущие Java-проекты становятся все больше и больше, я чувствую также растущую потребность вставлять отладочный вывод в несколько пунктов моего кода.
Чтобы включить или отключить эту функцию соответствующим образом, в зависимости от открытия или закрытия тестовых сессий, я обычно помещаю private static final boolean DEBUG = false
в начало классов, которые проверяют мои тесты, и тривиально использую ее таким образом (например):
public MyClass {
private static final boolean DEBUG = false;
... some code ...
public void myMethod(String s) {
if (DEBUG) {
System.out.println(s);
}
}
}
и тому подобное.
Но это меня не радует, потому что, конечно, это работает, но может быть слишком много классов, чтобы установить для DEBUG значение true, если вы не смотрите только на пару из них.
И наоборот, я (как и многие другие) не хотел бы переводить все приложение в режим отладки, поскольку объем выводимого текста может быть чрезмерным.
Итак, есть ли правильный способ архитектурно обработать такую ситуацию или самый правильный способ - использовать член класса DEBUG?
Ответы:
Вы хотите взглянуть на каркас каротажа и, возможно, каркас фасада каротажа.
Существует множество каркасов журналирования, часто с перекрывающимися функциональными возможностями, настолько, что со временем многие эволюционировали, полагаясь на общий API, или стали использоваться через каркас фасада для абстрагирования их использования и обеспечения возможности их замены на месте. если нужно.
Каркасы
Некоторые каркасы
Некоторые лесозаготовительные фасады
использование
Основной пример
Большинство этих фреймворков позволит вам написать что-то в форме (здесь используется
slf4j-api
иlogback-core
):Обратите внимание на использование текущего класса для создания выделенного регистратора, который позволил бы SLF4J / LogBack отформатировать вывод и указать, откуда пришло сообщение регистрации.
Как отмечено в руководстве по SLF4J , типичным шаблоном использования в классе обычно является:
Но на самом деле, еще более часто объявлять регистратор в форме:
Это позволяет использовать регистратор и внутри статических методов, и он используется всеми экземплярами класса. Это, скорее всего, будет вашей предпочтительной формой. Однако, как отметил Брендан Лонг в комментариях, вы должны быть уверены, что понимаете последствия и принимаете соответствующие решения (это относится ко всем каркасам ведения журналов, следующим за этими идиомами).
Есть и другие способы создания регистраторов, например, с помощью строкового параметра для создания именованного регистратора:
Уровни отладки
Уровни отладки варьируются от одного фреймворка к другому, но наиболее распространенными являются (в порядке критичности, от доброкачественного до плохого дерьма и, вероятно, от очень распространенного до, мы надеемся, очень редкого):
TRACE
Очень подробная информация. Должны быть записаны только в журналы. Используется только для отслеживания потока программы на контрольных точках.DEBUG
Подробная информация. Должны быть записаны только в журналы.INFO
Известные события во время выполнения. Должно быть сразу видно на консоли, поэтому используйте экономно.WARNING
Странности времени выполнения и исправимые ошибки.ERROR
Другие ошибки во время выполнения или неожиданные условия.FATAL
Серьезные ошибки, вызывающие преждевременное прекращение.Блоки и Охранники
Теперь, скажем, у вас есть секция кода, где вы собираетесь написать несколько отладочных операторов. Это может быстро повлиять на вашу производительность, как из-за влияния самой регистрации, так и из-за генерации любых параметров, которые вы можете передать методу регистрации.
Чтобы избежать такого рода проблем, вы часто хотите написать что-то в форме:
Если бы вы не использовали эту защиту перед блоком операторов отладки, даже если сообщения могут не выводиться (если, например, ваш регистратор в настоящее время настроен на печать только вещей выше
INFO
уровня),heavyComputation()
метод все равно был бы выполнен ,конфигурация
Конфигурация в значительной степени зависит от вашей среды ведения журналов, но они предлагают в основном те же методы для этого:
Они также предлагают в основном те же возможности:
Вот типичный пример декларативной конфигурации с использованием
logback.xml
файла.Как уже упоминалось, это зависит от вашей среды и могут быть другие альтернативы (например, LogBack также позволяет использовать скрипт Groovy). Формат конфигурации XML также может варьироваться от одной реализации к другой.
Для большего количества примеров конфигурации, пожалуйста, обратитесь (среди прочих) к:
Немного исторического веселья
Пожалуйста , обратите внимание , что Log4J видит серьезное обновление в данный момент, переход от версии 1.x до 2.x . Возможно, вы захотите взглянуть на оба из них для большего исторического веселья или путаницы, и если вы выбираете Log4J, вероятно, предпочтет перейти с версии 2.x.
Стоит отметить, как отметил Майк Партридж в комментариях, что LogBack был создан бывшим членом команды Log4J. Который был создан для устранения недостатков платформы Java Logging. И что в будущей основной версии Log4J 2.x теперь есть несколько функций, взятых из LogBack.
Рекомендация
Суть в том, чтобы оставаться отстраненным как можно дольше, поиграйтесь с несколькими и посмотрите, что подходит вам лучше всего. В конце концов, это просто каркас регистрации . За исключением случаев, когда у вас есть очень конкретная причина, кроме простоты использования и личных предпочтений, любой из них вполне подойдет, так что нет смысла зависать над ним. Большинство из них также могут быть расширены для ваших нужд.
Тем не менее, если бы мне пришлось сегодня выбирать комбинацию, я бы выбрал LogBack + SLF4J. Но если бы вы спросили меня несколько лет спустя, я бы порекомендовал Log4J с протоколированием Apache Commons, поэтому следите за вашими зависимостями и развивайтесь вместе с ними.
источник
static
, так как это экономит небольшой объем памяти, но вызывает проблемы в некоторых случаях: slf4j.org/faq.html#declared_staticиспользовать каркас регистрации
Большую часть времени есть статический метод фабрики
тогда вы можете вывести свой лог-код с разными уровнями:
тогда будет один файл, в котором вы сможете определить, какие сообщения для каждого класса должны быть записаны в вывод журнала (файл или stderr)
источник
Это как раз то, для чего предназначены такие каркасы журналирования, как log4j или более новый slf4j. Они позволяют очень подробно контролировать ведение журнала и настраивать его даже во время работы приложения.
источник
Фреймворк журналов - это определенно правильный путь. Однако у вас также должен быть хороший набор тестов. Хорошее покрытие тестами часто может полностью исключить необходимость отладки.
источник