2010-03-25 2 views
8

В нашей заявке сегодня возникла разочаровывающая проблема, которая сводилась к исключению . Тип исключения был всего около всего, что было зарегистрировано, что довольно бесполезно (но, о, уважаемое устаревшее приложение, мы все равно любим вас, в основном). Я перераспределял приложение с изменением, которое регистрирует трассировку стека при обработке исключений (и сразу же обнаруживает основную причину проблемы) и задается вопросом, почему никто раньше этого не делал. Как правило, вы регистрируете трассировку стека и есть ли причина, по которой вы этого не сделаете?Любая причина не всегда регистрировать трассировки стека?

Бонусные баллы, если вы можете объяснить (почему, а не как) обоснование необходимости прыгать обручами в java, чтобы получить строковое представление трассировки стека!

+0

Было ли это наследие использованием 'Log4J'? Если да, использовал ли он 'org.apache.log4j.RollingFileAppender'? Я использую его в банковских приложениях (да, система огромна), и у меня не было никаких проблем. –

+2

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

+0

@danben - правильно, речь идет об общих практиках, касающихся регистрации стеков, а не о том, как это сделать. –

ответ

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

  • Регистрация во многом может привести к слишком большому количеству информации, то есть никакой информации для системных администраторов. Если их журналы заполнены сообщениями отладки, они не смогут распознать подозрительные шаблоны. (Несколько лет назад я видел систему регистрации всех системных вызовов, по соображениям безопасности. Были так много журналов, что никто не видел, когда некоторые непривилегированных пользователи начали суперпользователя.)

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

+0

Хорошие баллы. Спасибо –

+0

Не знаете, как stacktrace может содержать конфиденциальную информацию. –

+1

@matt b: Знание определенных имен классов - это информация, достаточная для создания вектора атаки (вы помните эту ошибку в Hibernate Validator xyz ..) В безопасности, если вы не можете себе представить сценарий, лучше предположить худшее. – sibidiba

1

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

+3

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

+0

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

2

Обычно я записываю трассировку стека, потому что у нее есть информация для устранения неполадок/отладки проблемы. Лучше всего подумать рядом с мини-насосом и часто приводит к решению просто путем проверки кода и определения проблемы.

BTW, я согласен с sibidiba о раскрытии потенциального раскрытия информации о внутренних компонентах вашего приложения: имена функций вместе с последовательностью вызовов стека могут многое рассказать образованному читателю. Именно по этой причине некоторые продукты регистрируют только адрес символа в стеке и полагаются на разработчиков для разрешения адреса на имя из внутреннего pdbs.

Но в том, что запись текста в файлы, содержащие 1 строку ошибки и 14 строк стека, очень затрудняет навигацию по журналам ошибок. Это также вызывает проблемы с приложениями с высокой степенью совместимости, поскольку блокировка в файле журнала удерживается дольше (или, что еще хуже, файлы журналов чередуются). Много раз сталкиваясь с этими проблемами, а также с другими проблемами в поддержке и устранении неполадок при развертывании моих собственных приложений, я фактически создал службу для регистрации ошибок на bugcollect.com. При разработке политик сбора ошибок я решил каждый раз собирать дампы стека и использовать стеки как часть ключей ведра (чтобы группировать ошибки, которые происходят в одном стеке, в одно и то же ведро).

1

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

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

Причина, по которой она свернута, чтобы получить трассировку стека в виде строки, заключается в том, что в JRE нет StringPrintWriter. Я считаю, что линия мышления заключается в том, что они обеспечивают множество ортогональных строительных блоков, которые затем объединяются как необходимо. Вы должны сами собрать необходимый PrintWriter.

3

Пожалуйста, смотрите на эти вопросы также

Logging in Java and in general: Best Practices?

Best practices for Java logging from multiple threads?

Важные вещи здесь, чтобы рассмотреть

  1. Обработка конфиденциальных данных
  2. Компактные сообщения исключений и рассылки тех соответствующих фиксаторов
  3. Регистрация, что требуется. Поскольку его каротаж дорого в плане пространстве и время
0

бонусных очков, если вы можете объяснить (почему, не как) Обоснование имея прыгать обручи в Java, чтобы получить строку представления стека след!

Разве вам не нужно регистрировать бросок вместо того, чтобы проходить через обручи, чтобы распечатать стек? Например: log.error («Не удалось развернуть!», Например). С учетом броска Log4J будет печатать как сообщение об ошибке, полученное с помощью getMessage(), так и трассировку стека.

+0

Как уже говорилось выше, я не использую Log4J –

0

То, что я видел много есть код регистрации исключение вроде этого:

LOG.error (ех);

Поскольку log4j принимает объект как первый аргумент, он регистрирует строковое представление Исключения, которое часто является только именем класса. Обычно это просто надзор со стороны разработчиков. Лучше зарегистрировать и сделать ошибку следующим образом:

LOG.error ("foo случился", ex);

..что при правильной настройке структура ведения журнала регистрирует трассировку стека.

+0

Не уверен, почему у всех здесь создается впечатление, что я использую Log4J! –

Смежные вопросы