Ведение журнала ошибок в 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 вместо того, чтобы передаваться обратно в приложение для обработки. Это происходит потому, что частота таких ошибок в противном случае может привести к переполнению журнала событий или обработчика приложения.

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

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

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

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

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

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

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

Примечание.

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

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

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

net stop http
net start http

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

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

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

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

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

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

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

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

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

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

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

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

Поле Описание
Date Поле "Дата" соответствует формату W3C. Это поле основано на времени в формате UTC. Поле "Дата" всегда содержит 10 символов в формате YYYY-MM-DD. Например, 1 мая 2003 г. выражается как 2003-05-01.
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) используется в качестве заполнителя для пустого поля.
Кодивная строка и запрос 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/S Произошла ошибка, не поддерживаемая версией (ошибка HTTP 505).