Как сохранить собственные строки отладки, не проверяя их?

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

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

Итак, как мне сохранить эти важные для меня строки кода локально, не проверяя их?

Уточнение: Многие ответы связаны с выводом журнала, и вы с уровнями журнала можете это отфильтровать. И я согласен с этим.

Но. Я также упомянул проблему загрязнения самого кода. Если кто-то помещает оператор журнала между каждой второй строкой кода, чтобы все время печатать значения всех переменных. Это действительно затрудняет чтение кода. Так что мне бы тоже хотелось этого избежать. В основном, вообще не проверяя код регистрации. Итак, вопрос: как сохранить свои собственные строки журнала специального назначения. Таким образом, вы можете использовать их для своих отладочных сборок, не загромождая зарегистрированный код.

Было бы полезно знать, какую систему управления версиями вы используете.

Troy Howard 18.10.2008 02:04
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
6
1
609
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Какую систему управления версиями вы используете? Git позволяет сохранять локальные ветки. В худшем случае вы можете просто создать свою собственную ветку «Andreas» в репозитории, хотя управление ветвями может стать довольно болезненным.

But if I would check this in into the source code repository, my colleagues would get angry on me for polluting the Log output and polluting the code.

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

Почему бы не заключить их в директивы препроцессора (при условии, что конструкция существует на выбранном вами языке)?

#if DEBUG
    logger.debug("stuff I care about");
#endif

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

if (logger.isTraceEnabled()) {
    logger.log("My expensive logging operation");
}

Таким образом, если в один прекрасный день что-то в этой области все-таки возникнет, вы сможете снова включить ведение журнала на этом уровне и получить (надеюсь) полезные отзывы.


Note that both of these solutions would still allow the logging statements to be checked in, but I don't see a good reason нет to have them checked in. I am providing solutions to keep them out of production logs.

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

DOK 16.10.2008 19:58

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

Chris Marasti-Georg 16.10.2008 20:15

Похожий на

#if DEBUG #endif....

Но это все равно будет означать, что любой, кто работает с конфигурацией «Отладка», попадет в эти строки.

Если вы действительно хотите их пропустить, используйте уровень журнала, который больше никто не использует, или ....

Создайте другую конфигурацию запуска под названием MYDEBUGCONFIG а затем поместите код отладки между блоками следующим образом:

#if MYDEBUGCONFIG 
...your debugging code
#endif;

Если бы это была действительно постоянная проблема, я бы предположил, что центральный репозиторий является основной версией, и в конечном итоге я бы использовал файлы исправлений, чтобы содержать различия между официальной версией (последней, над которой я работал) и моя версия с кодом отладки. Затем, когда мне нужно было восстановить мою отладку, я проверял официальную версию, применял свой патч (с помощью команды patch), исправлял проблему и перед регистрацией удалял патч с помощью patch -R (для обратного патча).

Однако в этом не должно быть необходимости. Вы должны быть в состоянии согласовать методологию, которая сохраняет информацию в официальной строке кода, с механизмами для управления объемом производимой отладки. И это должно быть возможно независимо от того, есть ли в вашем языке условная компиляция в том смысле, в каком есть C или C++, с препроцессором C.

ИМХО, вам следует избегать решения #if. Это способ условной отладки в C / C++. Вместо этого присвойте всем функциям ведения журнала / отладки ConditionalAttribute. Конструктор атрибута принимает строку. Этот метод будет вызываться только в том случае, если определено конкретное определение препроцессора с тем же именем, что и строка атрибута. Это имеет те же последствия для времени выполнения, что и решение # if / # endif, но выглядит намного лучше в коде.

Если вы действительно делаете что-то вроде:

puts a log statement between every other line of code, to print the value of all variables all the time. It really makes the code hard to read.

Это проблема. Вместо этого рассмотрите возможность использования тестовой среды и напишите там код отлаживать.

С другой стороны, если вы пишете всего несколько строк отладки, вам удастся избежать их вручную (например, удалив соответствующие строки с помощью редактора перед фиксацией и отменив изменение после того, как оно было сделано) - но, конечно же быть очень нечастым!

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

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

Не уверен, какой исходный код вы используете. С моим вы можете легко получить список вещей, которые «ожидают проверки». И вы можете инициировать фиксацию через API.

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

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

Опять же, это не займет много времени, и его не составит труда использовать позже. Я не ожидаю, что вы найдете что-то, что делает это для вас уже сделано (и для вашего источника управления), я думаю, это довольно специфично.

Если это SVN, это чертовски легко сделать ... Создайте небольшой скрипт на Perl, который удаляет все элементы, обернутые комментариями вроде // remove-before-checkin-begin to // remove-before-checkin-end (возможно, вы захотите выбрать что-нибудь покороче, и сделайте для него отрывок в VS).

Troy Howard 18.10.2008 02:03
Ответ принят как подходящий

Если единственной целью отладочного кода, с которым у вас возникают проблемы, является отслеживание значений некоторых переменных, я думаю, что вам действительно нужен отладчик. С помощью отладчика вы можете наблюдать за состоянием любой переменной в любой момент.

Если вы не можете использовать отладчик, вы можете добавить код для печати значений в некоторых отладочных выводах. Но этот код должен состоять всего из нескольких строк, цель которых - упростить исправление, которое вы делаете. Как только он зафиксирован в транке, он исправлен, и вам больше не понадобятся эти отладочные строки, поэтому вы должны их удалить. Не удаляйте весь код отладки, хороший код отладки очень полезен, удалите только свой «личный» код отладки трассировки.

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

Следующее предложение - безумие, не делай этого, но ты мог бы ...

Окружите свой личный код регистрации комментариями, например

// ##LOG-START##
logger.print("OOh A log statment");
// ##END-LOG##

И прежде, чем вы зафиксируете свой код, запустите сценарий оболочки, который удаляет ваши журналы.

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

В качестве альтернативы вы также можете не добавлять комментарий в конце каждой строки журнала и удалять их скриптом ...

logger.print("My Innane log message"); //##LOG

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

Другие вопросы по теме