Подтвердить что ты не робот

Какие рекомендации вы придерживаетесь для написания хороших отчетов о регистрации

Недавно я нашел оператор журнала в своей кодовой базе проектов, в которой говорится: "здесь я с параметром поиска == > =========== 11/30/2008 === 1 ==== 00:00 AM"

какие рекомендации вы придерживаетесь для написания хороших сообщений журнала в приложении?

4b9b3361

Ответ 1

Этот оператор `log 'больше похож на оператор трассировки.

Ведение журнала: отображение нормальных событий и ошибок

Трассировка: покажите путь выполнения, а также все события регистрации

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

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

Многие ответы здесь сосредоточены на полях, которые вы включили бы в сообщение журнала, но я бы сказал, что уровень размещения и ведения журнала вызовов журнала более важен. Если вы используете log4net, вы сможете включать/исключать штамп даты по умолчанию через конфигурационные файлы, но вы не сможете размещать или удалять записи журналов без перекомпиляции, поэтому имеет смысл серьезно подумать о том, куда они идут. Помимо стандартных полей, таких как метка времени и идентификатор потока, и т.д., Вы хотите узнать имя класса и метода, из которого был сделан вызов. Log4net et al. Заботится о имени класса уже, если вы перейдете к своей лучшей практике именования вашего регистратора после того типа, с которым вы связаны. Помимо этого, я обычно включаю имя метода. Это особенно необходимо для отслеживания, но я включаю его во все сообщения журнала.

Запись:

Вы хотите знать достаточно информации о том, какое действие нужно выполнить, чтобы вернуться назад и совать, если что-то пойдет не так. Хорошими кандидатами являются идентификаторы сообщений, адреса электронной почты, то, что однозначно идентифицирует рабочий элемент. Такое сообщение должно появиться, как только будут доступны такие данные, чтобы при чтении через файл журнала вы увидите что-то вроде "попытки сделать x с y", а затем, если мы увидим исключение, мы знаем, какой рабочий элемент нам нужно посмотреть, чтобы понять, почему мы потерпели неудачу.

Исключения журналов должны быть соединены с сообщением журнала "попытка", поэтому сообщение об ошибке имеет смысл в контексте при чтении журнала. Это означает мысль о структуре обработки исключений. Если вы используете .net, и вы хотите только регистрировать исключение, а не обрабатывать его, вы хотите изменить одно и то же исключение, а не новое, так что просто "бросайте" не "throw e", где "e" - ваше исключение пример. Посмотрите на это, если это не имеет смысла.

Tracing

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

Производительность

Для производительности строки используйте методы '* Format', если вы используете log4net или что-то подобное. Это внутренне будет использовать StringBuilder, чтобы вы не платили неизменную строчную штрафную сумму все время. Как правило, хотя ключ состоит в том, чтобы иметь возможность отключить трассировку для производительности и иметь протоколирование достаточно кратким, чтобы оставаться включенным, даже если сообщение журнала дорого. Когда это правильно сделано, их должно быть недостаточно, чтобы быть проблемой.

Ответ 2

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

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

MSG-12345 Пытался открыть "myfile.txt", вернул код ошибки "123 - файл не найден".

Это также помогает при попытке извлечь информацию из журнала с помощью некоторого регулярного выражения.

Ответ 3

Не выполняйте конкатенацию строк в операторах регистрации, по крайней мере, для отладочных инструкций.

В одном приложении Java, над которым я работал некоторое время назад, была мрачная производительность. Таким образом, мы взломали профайлер, чтобы увидеть, где были узкие места. Оказалось, что в основном это связано с операциями конкатенации String, возникающими при сборке заявлений о регистрации уровня DEBUG, которые произошли ВСЕ ВРЕМЯ во внутри вложенных внутренних петель и т.д. (Да, и подумать, что они добавлены в первую очередь, чтобы выяснить, почему производительность была настолько плоха!)

не делайте этого

LOGGER.debug("The variable was " + myVariable + " and we are doing " + foo);

Вместо сделайте это

if (LOGGER.isDebugEnabled()) {
  LOGGER.debug("put your debug statement here " + foo + " and " + bar);
}

Ответ 4

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

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

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

Ответ 5

Есть 5 аспектов, которые важны для меня (начиная с менее важных):

  • Включить отметку времени в записи журнала
  • Предоставить возможность отфильтровывать менее важные записи "спам". Хороших, старых квадратных скобок теги должно быть достаточно для grep. Было бы неплохо, если бы некоторые из них были сгенерированы автоматически - в зависимости от типа журнала (сообщение, предупреждение, утверждение и т.д.) И, при необходимости, уровень важности сообщения (спам, нормальный, высокий, критический). Добавление дополнительных тегов сужения контекста вручную также рекомендуется IMO.
  • Сделать функции журнала/макросы максимально простыми в использовании.
  • Немедленно сбросьте выходные буферы.
  • Предоставить возможность мгновенного и однозначного определения места генерации записи в журнале (имя исходного файла + номер строки). Это может быть сложно на некоторых языках, но очень часто зная, какое именно утверждение является неудачным, означает немедленное исправление ошибки. Кроме того, вы не теряете время для добавления идентификаторов места регистрации вручную (например, "SomeClass:: SomeMethod: Message" )

Ответ 6

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

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

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

Ответ 7

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

В больших проектах, где вы хотите получать сообщения от клиентов, сталкивающихся с проблемами, также помогает, если вы можете контролировать, какие части вашего приложения будут регистрироваться; например, если есть проблемы с чтением информации пользователя AD, вы можете добавить "AD_LOGGING = EVERYTHING" и получить подробную информацию о регистрации на этом, не видя информацию журнала из всех других разделов программы.