Файлы HAR — HTTP-лог для отладки, которого вы не знали, что вам нужно
Файлы HAR захватывают каждый HTTP-запрос, который делает ваш браузер — заголовки, временные метки, тела ответов, токены аутентификации. Вот что содержится в одном из таких файлов, как его захватывать и как использовать при возникновении ошибок.
Ваш вызов API не работает в производственной среде. Работает корректно в curl и локально. Поддержка открывает тикет и просит вас «поделиться файлом HAR». Вы уверенно киваете и ищете в новой вкладке «что такое файл HAR».
Это та вкладка. Вот что такое файл HAR, что в нём содержится и как его использовать для нахождения проблемы.
Что такое файл HAR
HAR означает HTTP Archive. Это JSON-файл, который фиксирует каждый HTTP-запрос, сделанный браузером во время сессии — URL, методы, коды состояния, заголовки запроса и ответа, тела запроса и ответа, куки и расчёты по времени. Все это, для каждого запроса на странице.
Формат был стандартизирован Веб-группой по производительности (версия спецификации 1.2) и поддерживается Chrome, Firefox, Safari и Edge. Представьте себе структурированный экспорт вкладки Network браузера — то, что вы передадите кему-то, кто отладит вашу проблему, не давая ему доступ к SSH на вашем компьютере.
Файлы HAR особенно полезны, когда сбой интермитентен, когда он воспроизводится только в определённом браузере или когда нужно показать поставщику, что его API возвращает код 500 и это не ошибка PEBKAC.
Как захватить файл HAR
Chrome и Edge
- Откройте DevTools (F12 или Cmd+Option+I на Mac)
- Перейдите на Сеть вкладка
- Включите Сохранение журнала если сбой происходит после перенаправления или перезагрузки страницы
- Воспроизведите проблему
- Правый клик в любом месте в списке запросов → Сохранить все как HAR с содержимым
Firefox
- Откройте DevTools → Сеть вкладка
- Воспроизведите запрос
- Нажмите на иконку шестерёнки → Сохранить все как HAR
Safari
- Включите меню Develop: Safari → Настройки → Расширенные настройки → Показать меню Develop
- Develop → Показать веб-инспектор → Сеть
- Воспроизведите проблему
- Нажмите на Экспорт кнопка (иконка стрелки в панели сети)
Одно из важных замечаний относительно Сохранение журнала: без этого HAR фиксирует только запросы, сделанные после загрузки текущей страницы. Если сбой происходит во время аутентификации или в цепочке перенаправлений, вы получите пустой или искажённый файл и потратите 20 минут на размышления. Включайте его до воспроизведения проблемы.
Что содержится в файле HAR
Каждый файл HAR имеет одинаковую структуру на верхнем уровне:
{
"log": {
"version": "1.2",
"creator": { "name": "Chrome", "version": "124.0.6367.82" },
"entries": [ ... ]
}
}
The entries массив — это место, где хранится вся полезная информация. Каждый элемент — это полный пары запрос/ответ. Обычный загрузка страницы генерирует от 50 до 200 элементов; сложный SPA, загружающий дашборд, может превысить это число.
Аннотированный элемент: ключевые поля
Вот разбор ключевых полей в одном элементе HAR:
| Поле | Расположение | Что он сообщает вам |
|---|---|---|
startedDateTime | Элемент | Время отправки запроса, в формате ISO 8601 UTC. Сопоставьте это с логами на сервере, чтобы найти точную строку в логах. |
time | Элемент | Общее время в миллисекундах с момента начала запроса до завершения ответа. Это значение используется при сортировке при поиске медленных запросов. |
serverIPAddress | Элемент | IP-адрес, который фактически обработал этот запрос. Критично при использовании балансировщиков нагрузки — показывает, какой экземпляр вы достигли. |
request.method | Запрос | GET, POST, PUT, DELETE и т.д. |
request.url | Запрос | Полный URL, включая строку запроса. Обратите внимание на возможное двойное кодирование параметров здесь. |
request.headers | Запрос | Все заголовки запроса. Включает Authorization — токены аутентификации здесь. Это проблема конфиденциальности. |
request.postData.text | Запрос | Незашифрованное тело запроса. Для API на JSON это ваше тело запроса. Если API отклоняет ввод, проверьте это сначала. |
response.status | Ответ | Код состояния HTTP. 0 обычно означает, что запрос был заблокирован до завершения. |
response.headers | Ответ | Заголовки ответа, включая Content-Type, Cache-Control, Set-Cookie. Полезно при отладке CORS. |
response.content.text | Ответ | Тело ответа. Для API на JSON это исходный JSON. Может быть закодирован в base64 для бинарных ответов. |
timings.blocked | Расчёты по времени | Время ожидания свободного места в соединении TCP. Высокие значения указывают на истощение пула соединений. |
timings.dns | Расчёты по времени | Время DNS-поиска. Более 50 мс требует внимания; более 200 мс — проблема. |
timings.connect | Расчёты по времени | Время установления TCP-соединения. Высокие значения = задержка сети или издержки TLS, а не медленность сервера. |
timings.wait | Расчёты по времени | Время от отправки запроса до получения первого байта (TTFB). Здесь медленные API проявляются. Высокое TTFB означает, что сервер медленно отвечает. |
timings.receive | Расчёты по времени | Время загрузки тела ответа. Высокое значение наблюдается только при больших объёмах ответа. |
Что следует искать на самом деле
Когда вы открываете HAR, вы обычно ищете одну из трёх вещей:
Запрос, который не срабатывает
Сортируйте или фильтруйте по response.status. В Chrome DevTools вы можете фильтровать в режиме ввода status-code:4xx или status-code:5xx. Как только вы найдёте неудачный запрос, прочитайте полный response.content.text — сообщение об ошибке от сервера обычно более полезно, чем код состояния.
Запрос, который работает медленно
Сортируйте элементы по timings.wait (TTFB) в порядке убывания. Высокое wait = ваш сервер работает медленно. Высокое timings.connect при нормальном wait = бутлентон находится в сети или в процессе TLS-рукопожатия, а не в вашем приложении. Эти данные указывают на совершенно разные решения, поэтому правильное определение экономит много времени, не виня неправильный слой.
Запрос, который отсутствует
Иногда ошибка — это отсутствующий запрос — вебхук, который не сработал, предварительный запрос OPTIONS, заблокированный CORS, вызов аналитики, съеденный блокировщиком рекламы. Сравните то, что должно быть в HAR, с тем, что есть. Отсутствие запроса — это данные.
Проблема конфиденциальности, которую нужно знать
Файлы HAR содержат всё. Включая:
Authorizationзаголовки — токены Bearer, учётные данные Basic authCookieзаголовки — сессионные токены, JWT, любые данные в куках- тела запроса и ответов — которые могут содержать пароли, PII или API-ключи
Chrome не удаляет ни одного из этих данных при экспорте. Перед тем как поделиться файлом HAR с поддержкой, поставщиком или коллегой за пределами вашей компании, удалите или скройте чувствительные поля.
Самый быстрый способ проверить и очистить HAR перед его передачей — это Форматер HAR-файла — вставьте свой файл, пройдите по элементам и скройте перед отправкой. Альтернативно, если вы привыкли к jq:
# Strip Authorization headers from all entries
jq '.log.entries[].request.headers |= map(select(.name | ascii_downcase != "authorization"))' file.har
Не самый красивый одноразовый код, но он работает.
Чтение сырого HAR-файла
HAR-файлы — это JSON, поэтому теоретически могут быть прочитаны в любом текстовом редакторе. На практике они огромны — типичная загрузка страницы создаёт файл с сотнями килобайт заголовков и тел, расположенных на глубоко вложенных ключах. Несколько способов их просмотра:
- Импортировать в DevTools — Chrome и Firefox поддерживают импорт HAR-файлов в вкладку Network через иконку шестерёнки. Это даёт вам ту же систему фильтрации и сортировки, что и при записи в реальном времени.
- Форматер HAR-файла — Браузерный, без установки. Хорошо, когда вы отправляете файл кему-то, у кого нет DevTools.
jq— Для фильтрации на командной строке.jq '.log.entries[] | select(.response.status >= 400) | {url: .request.url, status: .response.status}'извлекает все неудачные запросы с их URL в секундах.
Для быстрого анализа и фильтрации, jq быстрее всего. Для передачи и визуального просмотра, импорт в браузер или онлайн-форматер означает, что другой человек не должен знать, что jq это.
Установите наши расширения
Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска
恵 Табло результатов прибыло!
Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!
Подписаться на новости
все Новые поступления
всеОбновлять: Наш последний инструмент was added on Июн 26, 2026
