Ошибка ведения журнала в API HTTP

В этой статье описаны возможности ведения журнала ошибок интерфейсов программирования приложений (API) протокола передачи гипертекста (HTTP).

Исходная версия продукта: Windows Server 2008 R2, Windows Server 2008, Windows Server 2012 R2, Windows Server 2012, Windows 10, Windows 8.1
Исходный номер базы знаний: 820729

Сводка

Некоторые ошибки, возникающие в приложении на основе HTTP, автоматически обрабатываются API HTTP, а не передаются обратно приложению для обработки. Это происходит из-за того, что частота таких ошибок в противном случае может привести к переполнению журнала событий или обработчика приложения.

В следующих разделах описаны различные аспекты ведения журнала ошибок API HTTP.

  • Настройка ведения журнала ошибок HTTP API
    Параметры реестра управляют ошибками в журналах API HTTP, максимальным допустимым размером файлов журнала и расположением файлов журнала.

  • Формат журналов ошибок API HTTP
    API HTTP создает файлы журналов, которые соответствуют соглашениям о файлах журналов консорциума W3C. Для анализа этих файлов журнала можно использовать стандартные средства. Однако, в отличие от файлов журнала W3C, файлы журналов API HTTP не содержат имен столбцов.

  • Типы ошибок, регистрируемых API HTTP
    API HTTP регистрирует множество распространенных ошибок.

Следующие методы описывают устранение ошибок HTTP API.

Настройка ведения журнала ошибок HTTP API

Три значения реестра в разделе HTTP\Parameters управляют ведением журнала ошибок API HTTP. Эти разделы находятся в разделе реестра: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters.

Примечание.

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

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

Сведения о конфигурации в значениях реестра считываются при запуске драйвера API HTTP. Поэтому при изменении параметров необходимо остановить, а затем перезапустить драйвер для чтения новых значений. Для этого введите следующие команды консоли:

net stop http
net start http

Для именования файлов журнала используется следующее соглашение об именовании:
httperr + порядковый номер + .log
Пример: httperr4.log

Файлы журнала циклизируются, когда достигают максимального размера, заданного значением реестра ErrorLogFileTruncateSize. Это значение не может быть меньше 1 мегабайта (МБ).

Если конфигурация ведения журнала ошибок недопустимая или при возникновении какого-либо сбоя во время записи API HTTP в файлы журнала, API HTTP использует ведение журнала событий, чтобы уведомить администраторов о том, что ведение журнала ошибок не происходит.

В следующей таблице описаны значения конфигурации реестра.

Значение реестра Описание
EnableErrorLogging Значение DWORD, которое можно задать для параметра TRUE, чтобы включить ведение журнала ошибок, или ЗНАЧЕНИЕ FALSE, чтобы отключить его. Значение по умолчанию — TRUE.
ErrorLogFileTruncateSize DWORD, указывающий максимальный размер файла журнала ошибок в байтах. Значение по умолчанию — 1 МБ (0x100000).

Указанное значение не может быть меньше значения по умолчанию.
ErrorLoggingDir Строка, указывающая папку, в которую API HTTP помещает свои файлы ведения журнала.

API HTTP создает вложенную папку HTTPERR в указанной папке, а затем сохраняет файлы журнала во вложенной папке. Эта вложенная папка и файлы журнала получают одинаковые параметры разрешений. Учетные записи администратора и локальной системы имеют полный доступ. Другие пользователи не имеют доступа.

В следующем примере используется папка по умолчанию, если папка не указана в реестре:
%SystemRoot%\System32\LogFiles

Строковое значение ErrorLoggingDir должно быть полным локальным путем. Однако он может содержать %SystemRoot%. Нельзя использовать сетевой диск или сетевую папку.

Формат журналов ошибок API HTTP

Как правило, файлы журналов ошибок API HTTP имеют тот же формат, что и журналы ошибок W3C, за исключением того, что файлы журналов ошибок API HTTP не содержат заголовки столбцов. В каждой строке журнала ошибок API HTTP записывается одна ошибка. Поля отображаются в определенном порядке. Один символ пробела (0x0020) отделяет каждое поле от предыдущего поля. В каждом поле знаки плюс (0x002B) заменяют пробелы, табуляции и непечатаемые управляющие символы.

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

Поле Описание
Date Поле Дата соответствует формату W3C. Это поле основано на универсальном координированном времени (UTC). Поле Дата всегда содержит 10 символов в виде ГГГГ-ММ-ДД. Например, 1 мая 2003 г. выражается как 2003-05-01.
Time Поле Time соответствует формату W3C. Это поле основано на формате UTC. Поле времени всегда содержит восемь символов в формате MM:HH:SS. Например, 17:30 (UTC) выражается как 17:30:00.
IP-адрес клиента IP-адрес затронутого клиента. Значением в этом поле может быть IPv4-адрес или IPv6-адрес. Если IP-адрес клиента является IPv6-адресом, в адрес также включается поле ScopeId.
Порт клиента Номер порта для затронутого клиента.
IP-адрес сервера IP-адрес затронутого сервера. Значением в этом поле может быть IPv4-адрес или IPv6-адрес. Если IP-адрес сервера является IPv6-адресом, в адрес также включается поле ScopeId.
Порт сервера Номер порта затронутого сервера.
Версия протокола Версия используемого протокола.

Если подключение не было проанализировано достаточно для определения версии протокола, в качестве заполнителя пустого поля используется дефис (0x002D).

Если основной номер версии или анализируемый дополнительный номер версии больше или равен 10, версия регистрируется как HTTP/?.?.
Глагол Глагол указывает последний запрос, который анализируется, проходит. В него включены неизвестные глаголы, но все глаголы, размер которых превышает 255 байт, усекается до этой длины. Если команда недоступна, в качестве заполнителя пустого поля используется дефис (0x002D).
CookedURL + Query URL-адрес и все связанные с ним запросы регистрируются как одно поле, разделенное вопросительным знаком (0x3F). Это поле усечено с ограничением длины в 4096 байт.

Если этот URL-адрес был проанализирован ("приготовлен"), он регистрируется с преобразованием локальной кодовой страницы и обрабатывается как поле Юникода.

Если этот URL-адрес не был проанализирован ("подготовлен") во время ведения журнала, он копируется точно, без преобразования Юникода.

Если API HTTP не может проанализировать этот URL-адрес, в качестве заполнителя пустого поля используется дефис (0x002D).
Состояние протокола Состояние протокола не может превышать 999.

Если состояние протокола ответа на запрос доступно, он регистрируется в этом поле.

Если состояние протокола недоступно, в качестве заполнителя пустого поля используется дефис (0x002D).
SiteId Не используется в этой версии API HTTP. В этом поле всегда отображается дефис-заполнитель (0x002D).
Фраза причины Это поле содержит строку, которая определяет тип ошибки, которая регистрируется. Это поле никогда не остается пустым.
Имя очереди Это имя очереди запроса.

Ниже приведены примеры строк из журнала ошибок HTTP API:

2002-07-05 18:45:09 172.31.77.6 2094 172.31.77.6 80 HTTP/1.1 GET /qos/1kbfile.txt 503 - ConnLimit  
2002-07-05 19:51:59 127.0.0.1 2780 127.0.0.1 80 HTTP/1.1 GET /ThisIsMyUrl.htm 400 - Hostname  
2002-07-05 19:53:00 127.0.0.1 2894 127.0.0.1 80 HTTP/2.0 GET / 505 - Version_N/S  
2002-07-05 20:06:01 172.31.77.6 64388 127.0.0.1 80 - - - - - Timer_MinBytesPerSecond

Типы ошибок, регистрируемых API HTTP

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

В следующем списке указаны типы ошибок, регистрируемых API HTTP:

  • Ответы на запросы клиентов
    API HTTP отправляет клиенту ответ об ошибке, например ошибку 400, вызванную ошибкой синтаксического анализа в последнем полученном запросе. После отправки ответа об ошибке API HTTP закрывает подключение.

  • Время ожидания подключения
    API HTTP время ожидания подключения. Если запрос находится в ожидании, когда время ожидания подключения истекает, он используется для предоставления дополнительных сведений о подключении в журнале ошибок.

  • Потерянные запросы
    Процесс в пользовательском режиме неожиданно останавливается, пока все еще есть запросы в очереди, которые направляются в этот процесс. API HTTP регистрирует потерянные запросы в журнал ошибок. Определенные типы ошибок называются строками фразы причины, которые всегда отображаются в качестве последнего поля каждой строки ошибки. В следующей таблице указаны фразы причины HTTP API.

Фраза причины Описание
AppOffline Произошла ошибка недоступности службы (ошибка HTTP 503). Служба недоступна, так как ошибки приложения привели к отключению приложения.
AppPoolTimer Произошла ошибка недоступности службы (ошибка HTTP 503). Служба недоступна, так как процесс пула приложений слишком занят для обработки запроса.
AppShutdown Произошла ошибка недоступности службы (ошибка HTTP 503). Служба недоступна, так как приложение автоматически завершает работу в ответ на политику администратора.
BadRequest При обработке запроса произошла ошибка синтаксического анализа.
Client_Reset Соединение между клиентом и сервером было закрыто до того, как запрос можно было назначить рабочему процессу. Наиболее распространенная причина такого поведения заключается в том, что клиент преждевременно закрывает подключение к серверу.
Connection_Abandoned_By_AppPool Рабочий процесс из пула приложений неожиданно завершил работу или потерянный запрос, закрыв его дескриптор.
Connection_Abandoned_By_ReqQueue Рабочий процесс из пула приложений неожиданно завершил работу или потерянный запрос, закрыв его дескриптор. Относится к Windows Vista и более поздним версиям, а также к Windows Server 2008 и более поздних версий.
Connection_Dropped Соединение между клиентом и сервером было закрыто до того, как сервер мог отправить свой окончательный пакет ответа. Наиболее распространенная причина такого поведения заключается в том, что клиент преждевременно закрывает подключение к серверу.
Connection_Dropped_List_Full Список удаленных подключений между клиентами и сервером заполнен. Относится к Windows Vista и более поздним версиям, а также к Windows Server 2008 и более поздних версий.
ConnLimit Произошла ошибка недоступности службы (ошибка HTTP 503). Служба недоступна, так как достигнуто или превышено ограничение на подключение на уровне сайта.
Connections_Refused Память NonPagedPool ядра упала ниже 20 МБ и http.sys перестала получать новые подключения.
Отключено Произошла ошибка недоступности службы (ошибка HTTP 503). Служба недоступна, так как администратор перевел приложение в автономный режим.
EntityTooLarge Сущность превысила допустимый максимальный размер.
FieldLength Превышен предел длины поля.
Запрещено Во время синтаксического анализа был выполнен запрещенный элемент или последовательность.
Заголовок Произошла ошибка синтаксического анализа в заголовке.
Hostname (Имя узла) Ошибка синтаксического анализа при обработке имени узла.
Внутренний Произошла внутренняя ошибка сервера (ошибка HTTP 500).
Invalid_CR/LF Произошло незаконное возвращение перевозки или подача строки.
LengthRequired Отсутствует требуемое значение длины.
Н/Д Произошла ошибка недоступности службы (ошибка HTTP 503). Служба недоступна, так как произошла внутренняя ошибка (например, сбой выделения памяти или конфликт списка резервирования URL-адресов).
N/I Произошла не реализованная ошибка (ошибка HTTP 501) или ошибка недоступности службы (ошибка HTTP 503) из-за неизвестной кодировки передачи.
Номер Ошибка синтаксического анализа при обработке числа.
Предпосылкой Отсутствуют необходимые предварительные условия.
QueueFull Произошла ошибка недоступности службы (ошибка HTTP 503). Служба недоступна, так как очередь запросов приложения заполнена.
RequestLength Превышен предел длины запроса.
Timer_AppPool Срок действия подключения истек, так как запрос слишком долго ждал в очереди пула приложений, чтобы серверное приложение выдало очередь и обработало ее. Это время ожидания — ConnectionTimeout. По умолчанию это значение равно двум минутам.
Timer_ConnectionIdle Срок действия подключения истек и остается в бездействии. Длительность connectionTimeout по умолчанию составляет две минуты.
Timer_EntityBody Срок действия подключения истек до поступления текста сущности запроса. Если запрос явно содержит тело сущности, API HTTP включает таймер Timer_EntityBody. Сначала для этого таймера устанавливается значение ConnectionTimeout (обычно это две минуты). При каждом получении другого указания данных в этом запросе API HTTP сбрасывает таймер, чтобы предоставить подключение еще две минуты (или то, что указано в ConnectionTimeout).
Timer_HeaderWait Срок действия подключения истек, так как анализ заголовка для запроса занял больше времени, чем ограничение по умолчанию в два минуты.
Timer_MinBytesPerSecond Срок подключения истек, так как клиент не получал ответ с разумной скоростью. Скорость отправки ответа была медленнее, чем по умолчанию 240 байт/с. Которым можно управлять с помощью свойства метабазы MinFileBytesPerSec.
Timer_ReqQueue Срок подключения истек, так как запрос слишком долго ждал в очереди пула приложений, чтобы серверное приложение выдало очередь. Это время ожидания — ConnectionTimeout. По умолчанию это значение равно двум минутам. Относится к Windows Vista и более поздним версиям, а также к Windows Server 2008 и более поздних версий.
Timer_Response Защищены. В настоящее время не используется.
Timer_SslRenegotiation
Срок действия подключения истек, так как повторное согласование ssl между клиентом и сервером заняло больше времени, чем время ожидания по умолчанию в две минуты.
URL-адрес Ошибка синтаксического анализа при обработке URL-адреса.
URL_Length URL-адрес превысил максимальный допустимый размер.
Глагол Ошибка синтаксического анализа при обработке глагола.
Version_N/с Произошла ошибка, не поддерживаемая версией (ошибка HTTP 505).