Инструменты логов и наблюдаемости

Форматирование stack traceдля JavaScript, Python, Java, Go, C# и Rust

Вставьте stack trace — язык определится автоматически (или выберите вручную), а фреймворковые кадры можно свернуть.

Форматирование stack trace

Пример:
Язык

Stack trace

Всё выполняется локально в браузере. Stack trace никогда не загружается на сервер.

Кадры

Ввод… разбор запустится автоматически

Необработанный stack trace, вываленный в терминал или в баг-репорт, — это стена почти одинаковых строк "at ..." или "File ...", а тот единственный кадр, что указывает на ваш код, обычно погребён где-то в середине внутренних вызовов фреймворка. Называйте это форматирование stack trace, разбор stack trace или трассировка стека — суть одна: превратить эту стену текста в список кадров, который можно охватить одним взглядом.

Полезно именно в тот момент, когда перед вами реальное исключение — из консоли браузера, лога CI, отчёта о падении или сообщения коллеги — и нужны цепочка вызовов, точные файл и строка, а также первопричина, без ручного подсчёта блоков "Caused by:" и прокрутки полусотни кадров node_modules в поисках своего кода. Вся обработка происходит прямо во вкладке браузера; ничего из вставленного никуда не отправляется.

Зачем нужно это форматирование stack trace

Сделано под шесть реальных форматов stack trace, а не один общий шаблон, натянутый на все случаи.

Автоопределение, которое всегда можно переопределить

После вставки текста язык обычно определяется верно — по синтаксису самих кадров, так что выпадающий список почти никогда не нужен трогать. Если трасса смешивает стили или автоопределение ошиблось, шесть явных языков (JavaScript/Node, Python, Java/Kotlin, Go, C#/.NET, Rust) выбираются одним кликом, так что вы никогда не застрянете на догадке, которую нельзя поправить.

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

Цепочки Caused by показаны отдельными блоками

Исключение Java с цепочкой Caused by или traceback Python, связанный фразой "During handling of...", разбивается на отдельные подписанные блоки по порядку — первопричина внизу находится так же легко, как внешнее исключение наверху, вместо одного длинного неразличимого потока кадров.

Java stack trace разбит на два блока, соединённых меткой Caused by, первопричина показана последней

Шум фреймворка сворачивается в одну строку

При включённом сворачивании кадров фреймворка подряд идущие кадры node_modules, site-packages или org.springframework сворачиваются в строку "свёрнуто N кадров" — так ваш собственный код виден в первую очередь. Любую свёрнутую группу можно снова открыть одним кликом.

Серия кадров node_modules свёрнута в одну строку-сводку, над ней виден собственный кадр пользователя

Три вещи, которые этот список кадров делает за вас автоматически

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

01

Вставьте любой из шести поддерживаемых форматов

Вставляйте исходный stack trace JavaScript/Node, Python, Java/Kotlin, Go, C# или Rust без предварительной очистки. Разбор запускается автоматически примерно через 350 миллисекунд после остановки ввода, либо отключите автоматический разбор в пользу кнопки и сочетания Ctrl/Cmd+Enter.

  • Загрузите один из трёх встроенных примеров, чтобы увидеть цепочку Caused by, traceback Python и шум node_modules, ничего не набирая
  • Строка, не совпадающая ни с одним известным форматом кадра, остаётся как есть и помечается «Не распознано», не приводя к ошибке всего разбора
02

Сверните кадры, которые не нужно читать

Подряд идущие кадры node_modules, site-packages, java./org.springframework., runtime., std::/core:: или System. (в зависимости от определённого языка) сворачиваются в строку "свёрнуто {count} кадров", когда опция включена. Переключение опции не запускает повторный разбор — тот же результат просто перегруппировывается мгновенно.

  • Единственный кадр фреймворка среди вашего кода не сворачивается — сворачивание срабатывает только начиная с двух подряд идущих кадров
  • Любую свёрнутую группу можно развернуть по отдельности одним кликом, не выключая весь переключатель
03

Скопируйте именно то, что нужно

Клик по file:line любого распознанного кадра копирует только это место — удобно, чтобы сразу перейти к нужной строке в редакторе. Копирование и скачивание экспортируют всю переформатированную трассу как обычный текст в стиле, характерном для этого языка; обе кнопки отключаются, как только меняются ввод или настройки, так что скопировать устаревший результат невозможно.

  • Тип и сообщение исключения выделяются над каждым блоком, включая каждую причину Caused by
Открыть форматирование stack trace

Что этот список кадров даёт сверх обычного текста

Структурированные поля, определение цепочек и сворачивание шума для шести реальных форматов.

Распознавание кадров для шести языков

У JavaScript/Node, Python, Java/Kotlin, Go, C#/.NET и Rust свой синтаксис кадра, который разбирается на имя функции, файл, строку и столбец там, где формат это позволяет, — не построчно вслепую. Именно поэтому форматирование stack trace здесь читается так же, как вывод самой среды выполнения.

Цепочки Caused by и traceback

Цепочка Caused by в Java и многоуровневые traceback в Python распознаются как отдельные упорядоченные блоки, включая первопричину — не нужно считать уровни отступов на глаз.

Шум фреймворков можно сворачивать

node_modules, site-packages, java./org.springframework. и другие пространства имён фреймворков сворачиваются в одну сводную строку по правилам конкретного языка, и любую группу можно снова развернуть одним кликом.

Копирование file:line для каждого кадра

У каждого распознанного кадра своя кнопка копирования только его файла и строки, отдельно от копирования всей трассы.

Нераспознанные строки остаются видимыми

Строка, не соответствующая синтаксису выбранного формата, не отбрасывается: она остаётся на месте с пометкой «Не распознано», не приводя к ошибке всего разбора.

Что этот инструмент делает, а что нет

Реальное поведение и настоящие ограничения, а не общий отказ от ответственности.

Без символизации и без обратного разбора source map
Минифицированные имена функций и сжатые пути показываются в точности как вставлены. Чтобы вернуть их к реальным позициям в исходном коде, понадобилась бы соответствующая source map или отладочные символы, которые это форматирование stack trace никогда не загружает и не запрашивает извне.
Только текстовые stack trace, без бинарных дампов
Core dump, minidump и другие бинарные артефакты падений не принимаются — вставьте текстовый stack trace, который уже вывела ваша среда выполнения или инструмент отчётов о падениях.
Шесть заявленных языков, без бесконечных догадок
Распознаётся только синтаксис кадров JavaScript/Node, Python, Java/Kotlin, Go, C#/.NET и Rust. Трассы Ruby, PHP, C/C++ и Swift в основном вернутся как «Не распознано», а не будут насильно подогнаны под неверный формат.
Копирование и скачивание всегда дают обычный текст
Переформатированный результат никогда не оборачивается в блок кода Markdown, хотя некоторые похожие инструменты так делают, — он остаётся обычным текстом, чтобы аккуратно вставляться в терминал, редактор или тикет.

Частые вопросы про форматирование stack trace

Ответы на вопросы, которые возникают перед тем, как вставить настоящее исключение в онлайн-инструмент.

Безопасно ли вставлять stack trace в онлайн-инструмент?

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

Как скрыть кадры node_modules в stack trace?

Включите «Свернуть кадры фреймворка» на панели инструментов. Подряд идущие кадры node_modules (или site-packages, java./org.springframework. и подобные) сворачиваются в одну строку, а клик по ней снова разворачивает группу.

Поддерживает ли это форматирование stack trace Java, Python и JavaScript?

Да, а ещё Go, C#/.NET и Rust — всего шесть языков. Автоопределение обычно выбирает верный язык по синтаксису кадров; язык также можно задать вручную в выпадающем списке.

В чём разница между stack trace, traceback и backtrace?

Это одно и то же понятие под разными именами в разных экосистемах — в Python это traceback, в C и Ruby часто говорят backtrace, а в JavaScript, Java, C#, Go и Rust обычно говорят stack trace. Этот инструмент распознаёт их все, так что можно пользоваться любым привычным термином.

Удаляются ли пути к файлам или имена пользователей перед тем, как поделиться трассой?

Нет — пути и другие детали показываются точно так, как вставлены, ничего не скрывается автоматически. Раз ничего и так не покидает браузер, стоит самостоятельно проверить текст перед тем, как вставлять его в менее приватное место, например в публичный баг-трекер.

Работает ли это для паник Go и бэктрейсов Rust, а не только для исключений?

Да. Дампы горутин Go (строка с именем функции плюс строка file:line с отступом табуляцией) и нумерованный вывод кадров Rust при RUST_BACKTRACE=1 разбираются так же, как языки с исключениями, включая их собственные шаблоны кадров фреймворка вроде runtime. или std::/core::.

Нашли реальную трассу, которую этот инструмент разбирает неправильно?

Открыть форматирование stack trace прямо сейчас

Вставьте stack trace на JavaScript, Python, Java, Go, C# или Rust и получите читаемый список кадров меньше чем за секунду — без загрузки, без регистрации.

Сохраните это бесплатное форматирование stack trace в закладки — пригодится для следующего исключения в терминале или почте.

Весь разбор выполняется локально в браузере.