К сожалению, бывают ситуации, когда боевая система ведёт себя непонятным образом, а повторить этот же глюк на тестовом комплексе ни как не удаётся. В эти минуты, бывает, жалеешь, что не проявил достаточной дальновидности при логировании событий, происходящих внутри сервера. Диагностика ошибок в таких случаях превращается в шаманские пляски вокруг «чёрного ящика» и гадание по полёту птиц о причинах сбоя.
Наиболее отчаянные из нас оказываются способны на такое безрассудство, как удалённое подключение отладчиком к боевой системе. Менее смелым или просто связанным по рукам жёсткими регламентами эксплуатации такой способ не подходит. Да и отладка многопоточного сервера под серьёзной нагрузкой никогда не была легким делом.
Построению более конкретных гипотез об истинном положении вещей обычно помогает добавление логирования в критических местах, но на яве это возможно только путём изменения кода, сборкой нового билда и развёртыванием его на реальном комплексе. Конечно, когда иного выхода нет, приходится идти и на это, но:
- Сборка должна включать тот же код, что сейчас работает на реальном комплексе плюс необходимое логирование, а ветка, в которой ведётся разработка уже обычно ушла вперёд. Это значит, требуются приседания по созданию в вашей системе управления исходным кодом новой ветки от того момента, когда собирался текущий билд (вы ведь ставите метки на каждую выпускаемую версию, не так ли?);
- Обновление кода боевой системы, как правило, требует её перезапуска и некоторого времени простоя, а это не всегда допустимо в текущий момент как по технологическим причинам (необходимость выдерживать SLA), так и по организационным (заявку на установку новой версии требуется согласовывать в инстанциях);
Хорошо, думается в такой час, нашим коллегам, пишущим на скриптовых языках: можно просто взять и обновить файлик-другой на живой системе, добавив туда вывод в лог. Вот если бы можно было так сделать на яве…
Теперь приятная новость: это возможно. В серии, начинающейся с этого поста, я подробно покажу как реализовать механизм, позволяющий добавлять логирование в код без пересборки и перезапуска системы.
Read more…
Статьи javassist, jmx, jvmti, logging