Каких рекомендаций вы придерживаетесь для написания хороших заявлений регистрации - PullRequest
20 голосов
/ 07 ноября 2008

Я недавно нашел в журнале своих проектов оператор журнала, который говорит "вот я с параметром поиска ==> =========== 30.11.2008 === 1 ==== 00:00 AM"

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

Ответы [ 7 ]

14 голосов
/ 07 ноября 2008

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

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

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

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

14 голосов
/ 07 ноября 2008

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

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

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

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

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

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

Ведение журнала :

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

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

Трассировка

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

Performance

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

6 голосов
/ 07 ноября 2008

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

У одного Java-приложения, над которым я работал некоторое время назад, была плохая производительность. Поэтому мы взломали профилировщик, чтобы увидеть узкие места. Оказалось, что это произошло в основном из-за операций конкатенации строк, возникающих при сборке операторов ведения журнала уровня 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);
}
5 голосов
/ 07 ноября 2008

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

  1. Включить отметку времени в записи журнала
  2. Предоставляет возможность отфильтровывать менее важные «спамовые» записи. Хороших старых тегов в квадратных скобках должно хватить для grep. Было бы хорошо, если бы некоторые из них были сгенерированы автоматически - в зависимости от типа журнала (сообщение, предупреждение, подтверждение и т. Д.) И, возможно, уровня важности сообщения (спам, обычный, высокий, критический). Добавление дополнительных тегов сужения контекста вручную также рекомендуется IMO.
  3. Сделайте функции / макросы журналов максимально простыми в использовании.
  4. Немедленно очистить выходные буферы.
  5. Обеспечить возможность мгновенного и однозначного определения места генерации записи в журнале (имя исходного файла + номер строки). В некоторых языках это может быть затруднено, но очень часто точно знать, какое утверждение не удалось, означает немедленное исправление ошибки. Кроме того, вы не теряете время на добавление идентификаторов места журнала вручную (например, «SomeClass :: SomeMethod: Message»)
4 голосов
/ 07 ноября 2008

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

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

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

2 голосов
/ 07 ноября 2008

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

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

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

2 голосов
/ 07 ноября 2008

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

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

...