Недавно мне пришлось исследовать полевую проблему для нашего крупного корпоративного приложения. Я был в ужасе от журналов, которые мне приходилось прочесывать, пытаясь найти проблему, и в конце дня журналы не помогли вообще идентифицировать / изолировать ошибку.
Примечание: я понимаю, что не все ошибки обнаруживаются через журналы. Это не меняет того факта, что журналы ужасны.
Есть некоторые очевидные проблемы с нашей регистрацией, которые мы уже можем попытаться исправить. Я не хочу перечислять их здесь, и я не могу просто показать вам наши файлы журналов, чтобы вы могли дать совет о том, что делать.
Вместо этого, чтобы оценить, насколько плохо мы делаем на фронте регистрации, я хотел бы знать:
- Каковы некоторые рекомендации , если таковые имеются, когда дело доходит до регистрации для приложения, особенно большого приложения.
- Есть ли какие-то паттерны, которым мы должны следовать, или анти-паттерны, о которых мы должны знать?
- Это важная вещь, которую нужно исправить, или это можно исправить, или все файлы журналов просто огромны, и вам нужны дополнительные сценарии для их анализа?
Примечание: мы используем log4j.
Я работаю с критически важными для безопасности системами реального времени, и регистрация часто является единственным способом ловить редкие ошибки, которые появляются один раз в синюю луну каждый 53-й вторник, когда наступает полнолуние, если вы ловите мой дрейф. Этот вид делает вас одержимым предметом, поэтому я сейчас извинюсь, если начну пениться у рта. Следующее было написано для журналов отладки собственного кода, но большинство из них применимо и к управляемому миру ...
Используйте текстовые файлы журнала. Кажется очевидным, но некоторые люди пытаются сгенерировать двоичные файлы журналов: это просто глупо, потому что мне не нужно искать инструмент для чтения, когда я в поле. Плюс, если это текст, а отладка многословна, есть хороший шанс, что полевой инженер сможет прочитать файл и диагностировать проблему, не возвращаясь ко мне. Все побеждают.
Я проектирую системы, которые способны регистрировать практически все, но я не включаю все по умолчанию. Отладочная информация отправляется в скрытое диалоговое окно отладки, которое ставит метки времени и выводит его в список (ограниченный до 500 строк перед удалением), и диалоговое окно позволяет мне остановить его, автоматически сохранить в файле журнала или перенаправить в прикрепленный отладчик. Это отвлечение позволяет мне видеть вывод отладки из нескольких приложений, все аккуратно сериализованные, что иногда может быть спасением. Я использовал , чтобы использовать цифровые уровни ведения журнала (чем выше вы установите уровень, тем больше вы захват):
но это слишком негибко - поскольку вы работаете над ошибкой, гораздо эффективнее иметь возможность сосредоточиться на входе именно на том, что вам нужно, без необходимости разбираться с кучей детрита, и это может быть один конкретный вид транзакции или операции это вызывает ошибку. Если для этого требуется, чтобы вы все включили, вы просто усложняете свою работу. Вам нужно что-то более мелкое.
Итак, сейчас я нахожусь в процессе перехода к ведению журнала на основе системы флагов. Все, что регистрируется, имеет флаг, подробно описывающий, какая это операция, и есть набор флажков, позволяющих мне определять, что регистрируется. Обычно этот список выглядит так:
Эта система ведения журнала поставляется с версией сборки, включенной и сохраняемой в файл по умолчанию. Уже слишком поздно выяснять, что вы должны были регистрироваться ПОСЛЕ того, как произошла ошибка, если эта ошибка возникает в среднем раз в шесть месяцев, и у вас нет возможности ее воспроизвести. Ведение журнала, которое работает только с отладочными сборками, просто. равнина. тупой.
Программное обеспечение обычно поставляется с включенными ERROR, BASIC, STATE_CHANGE и EXCEPTION, но это можно изменить в поле через диалоговое окно отладки (или настройки реестра / ini / cfg, где эти вещи сохраняются).
Да, и одно: моя система отладки генерирует один файл в день. Ваши требования могут отличаться. Но убедитесь, что ваш код отладки начинает каждый файл с даты, версии кода, который вы запускаете, и, если возможно, некоторого маркера для идентификатора клиента, местоположения системы или чего-либо еще. Вы можете получить кучу файлов журналов, поступающих с поля, и вам понадобится некоторая запись того, откуда и какая версия системы, на которой они работали, на самом деле в самих данных, и вы не можете доверять клиенту. / Инженер-полевой, чтобы сказать вам, какая у них версия - они могут просто сказать вам, какую версию, по их мнению, они получили. Хуже того, они могут сообщить версию exe, которая находится на диске, но старая версия все еще работает, потому что они забыли перезагрузить компьютер после замены. Пусть ваш код скажет вам сам.
Наконец, вы не хотите, чтобы ваш код генерировал свои собственные проблемы, поэтому вставьте функцию таймера для очистки файлов журнала через столько дней или недель (просто проверьте разницу между временем сейчас и временем создания файла). Это нормально для серверного приложения, которое работает постоянно, в клиентском приложении вы можете очистить все старые данные при запуске. Обычно мы производим очистку через 30 дней или около того, в системе без частых посещений инженера вы можете оставить ее подольше. Очевидно, это также зависит от размера ваших файлов журнала.
источник
Мой любимый общедоступный ресурс для рекомендаций по ведению журналов - Apache JCL Best Practices .
Несмотря на нацеленность на JCL, они кажутся достаточно общими, чтобы их можно было использовать для ведения журнала в целом.
Самый известный анти-паттерн - это, вероятно, «проглатывание исключений» - просто поищите его в Интернете.
Что касается огромных файлов журналов, в моей практике это был в основном нормальный случай. И да, дополнительные сценарии, как вы их называете, и / или такие инструменты, как бензопила, также выглядят нормально для меня.
PS. Что касается анти-паттернов, то другие, которые приходят на ум, - это «наводнения» и бессмысленные сообщения.
Я называю это флудингом, когда вижу множество похожих сообщений, поступающих из цикла со многими итерациями. Для меня наводнение достаточно раздражает, чтобы попытаться избавиться от него, когда я обнаруживаю его в исходном коде. Обычно его улучшение требует некоторого искусства - потому что вещи, которые происходят внутри цикла, могут быть интересными. Когда у меня нет времени, чтобы улучшить его глубже, я стараюсь, по крайней мере, изменить уровень регистрации таких сообщений на минимальный, чтобы упростить его фильтрацию.
Бессмысленные сообщения кажутся довольно популярным мусором. Они выглядят безвредными при чтении в исходном коде - я думаю, что нужно пройти через анализ анализа отладочной информации, похожей на ...
... чтобы глубоко оценить их присущее уродство. Моя любимая эвристика для обнаружения такого рода проблем на уровне исходного кода (предложенная коллегой в одном из моих прошлых проектов) - это подсчет числа появлений пробелов в строковых литералах, используемых при ведении журнала. По моему опыту, нулевые пробелы в основном гарантируют, что логирование бессмысленно, один пробел также является хорошим индикатором потенциальной проблемы.
источник
somethingSpecialHappenedCount
), а затем выведено в логгер.Зарегистрируйте исключение только один раз!
Одна из общих болевых точек, которую я заметил, это регистрация и повторное исключение. В результате файлы журнала содержат одни и те же исключения несколько раз на нескольких уровнях стека.
источник
Вот антишаблон: создание двух дюжин «общих переменных» полей в таблице базы данных для отслеживания чего-либо мыслимого, а затем получение 88 (и подсчет) различных значений перечисления для разных типов журналов.
источник
Мой опыт работы с журналами - чем больше, тем лучше, но он должен быть достаточно последовательным, чтобы его можно было фильтровать на машине, и иметь возможность настраивать уровень серьезности для каждого компонента вашего приложения в отдельности.
Кроме того, очень сложно предсказать, какие записи вам понадобятся, чтобы найти будущую ошибку. Большинство очевидных мест, где можно регистрировать ошибки, исправляются до того, как продукт выйдет за дверь. Результатом сообщения об ошибке нередко бывает, что вы просто добавили запись в журнал, чтобы помочь диагностировать ее, если это произойдет снова.
источник
Пару заметок с оперативной стороны дома здесь:
1) Убедитесь, что журналы настраиваются локально, желательно с помощью инструмента, не более тяжелого, чем текстовый редактор. Большую часть времени мы не хотим регистрировать уровень TRACE, но нам нравится включать его.
2) Если это вообще возможно, убедитесь, что журналы можно прочитать с помощью инструмента, не тяжелее, чем текстовый редактор. Нет ничего хуже, чем охотиться за инструментами в неурочный час, когда происходит сбой производственной системы.
источник
Из собственного опыта работы с веб-приложениями:
(и учитывая, что хранение сейчас очень дешево)
Будьте последовательны с вашими лог-строками. Так как я всегда использую этот тип шаблона:
источник
Помимо трассировки стека, запишите текущее состояние приложения и входные данные.
Программное обеспечение является детерминированным, эти два, как правило, единственные, что вам нужно, чтобы воспроизвести ошибку. Хранение полного состояния в некоторых случаях может быть проблематичным, поэтому способы воспроизведения текущего состояния, например, с помощью предыдущих входных данных, также хороши.
Конечно, больше данных всегда лучше, но как минимум эти два - хорошее начало для самых простых аварий.
источник