Куда / на каком уровне должен идти код регистрации? - PullRequest
18 голосов
/ 07 сентября 2010

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

Ответы [ 5 ]

19 голосов
/ 07 сентября 2010

Ведение журнала и трассировка - это (ИМО) изобразительное искусство, знание того, что регистрировать и где требуется опыт.

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

Все, что я могу вам предложить, это несколько советов:

Подумайте, как будет использоваться сообщение журнала.

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

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

  • Сбой вызова Windows API? Если это так, то вам, вероятно, нужно зарегистрировать HRESULT и GetLastError результат (если он есть), чтобы он был очень полезным.
  • Не удалось найти запись в коллекции? Без названия записи, которая не была найдена, на самом деле никто ничего не сможет вывести - было бы также полезно узнать счет коллекции, чтобы вы могли определить, является ли коллекция пустой.

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

Кроме того, убедитесь, что вы можете определить, что вошли сообщения. Если все, что вы можете увидеть в журнале, это строка, которая появляется в вашей кодовой базе много раз (или, что еще хуже, совсем не так!), То вам понадобится дедукция и хитрость, чтобы выяснить, откуда пришло это сообщение журнала (и без зная, откуда приходит сообщение, у вас мало надежды на его понимание)

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

Ведение журнала используется только при наличии проблемы

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

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

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

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

Вы также не должны путать ведение журнала с одитингом (хотя во многих системах эти два перекрываются).

Чем больше, тем лучше!

Единственный способ, которым вы можете войти слишком много, это если:

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

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

Если вы сомневаетесь в том, регистрировать ли что-либо или нет, зарегистрируйте ее.

Регистрировать исключения только один раз.

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

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

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

Записывать все, что имеет отношение, везде, где это уместно, регистрировать.

Например, если вывы пишете приложение на сервере, тогда ваши файлы журналов должны быть на сервере, где системные администраторы могут их читать - если, тем не менее, существует вероятность возникновения ошибок на клиенте (например, в JavaScript), тогда ваш код регистрации должен находиться вJavaScript.Решение?Ваша логина JavaScript должна быть отправлена ​​на сервер (ala log4js )

Не беспокойтесь о том, где вы должны и не должны поставь логи - ставь везде, где нужно.

11 голосов
/ 07 сентября 2010

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

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

Обратите внимание, что разные сообщения журнала могут иметь разные цели, даже в одном приложении:

  • Чтобы предоставить информацию о (нормальном) потоке событий в приложении (то есть приложение пакетной обработки может регистрировать, что оно запущено и завершено, возможно, краткий результат обработки и т. Д.). Желательно, чтобы таких сообщений было относительно немного, и они содержали бы ограниченный объем информации, поскольку они часто предназначены для чтения людьми (например, системный администратор для проверки утром, что приложение успешно запущено). Поскольку это «нормальные» сообщения, их приоритет находится в середине шкалы, например, INFO.
  • Для оповещения об исключительных событиях (например, об ошибках, сбоях, отсутствующих файлах ...). Эти сообщения должны быть редкими (в обычном приложении), но могут содержать чрезмерное количество информации (например, следы стека, дампы ядра и т. Д.), Которые могут помочь выявить основную ошибку. Однако, когда они случаются, мы почти всегда хотим их видеть, поэтому они имеют высокий приоритет, например, ERROR или FATAL.
  • Предоставить подробную информацию о том, что происходит в определенной части приложения (обычно для целей отладки). Эти сообщения, как правило, настоящие свиньи, часто генерирующие гигабайты данных журнала. Поэтому мы хотим видеть их только при определенных обстоятельствах, поэтому возможно установить их уровень на низком уровне, например DEBUG.

Современные каркасы ведения журналов, такие как семейство Log4J, позволяют очень гибко обрабатывать различные типы (уровни) сообщений из разных частей приложения. Тем не менее, это хорошая идея, чтобы спланировать свою схему регистрации перед добавлением множества сообщений журнала в код. То есть какие типы сообщений вы планируете регистрировать, какие части приложения и как вы собираетесь использовать эти сообщения? Сколько и какие цели журналов (консоль, файл, БД) вам нужны?

3 голосов
/ 07 сентября 2010

Я считаю, что руководство по архитектуре Microsoft хорошо прочитано. http://msdn.microsoft.com/en-us/library/ff650706.aspx

Лесозаготовка - это сквозная проблема всех слоев

2 голосов
/ 07 сентября 2010

Для того, что я реализовал до сих пор, я использовал стратегию «черного ящика».Каждый фрагмент кода (функция или / и класс) имеет свою ответственность во многих отношениях: тестирование ввода, выполнение того, для чего он предназначен, обработка ошибок, регистрация информации.Поэтому, если ваш фрагмент кода находится на бизнес-уровне, он должен выдавать ошибки по бизнесу, а также регистрировать информацию по бизнесу

0 голосов
/ 07 сентября 2010

Распространенная обработка ошибок, я думаю, очень важна в приложении.

С JavaWorld , следующие причины, по которым важна общая обработка ошибок:

  1. Набухшие журналы : Каждый блок catch содержит оператор журнала, что приводит к раздутым и избыточным записям журнала, вызванным загрязненным исходным кодом.

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

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

  4. Объявление нефиксированных исключений : Сигнатура метода обобщается для выброса java.lang.Exception. Таким образом, клиенты не имеют ни малейшего представления о семантике ошибок метода.

...