Registro de errores en API HTTP

En este artículo se describen las capacidades de registro de errores de las interfaces de programación de aplicaciones (API) del Protocolo de transferencia de hipertexto (HTTP).

Versión del producto original:   Windows Server 2008 R2, Windows Server 2008, Windows Server 2012 R2, Windows Server 2012, Windows 10, Windows 8.1
Número KB original:   820729

Resumen

Algunos errores que se producen en una aplicación basada en HTTP se controlan automáticamente mediante la API HTTP en lugar de pasarse de nuevo a una aplicación para su control. Este comportamiento se produce porque la frecuencia de estos errores podría inundar un registro de eventos o un controlador de aplicaciones.

En los temas siguientes se describen los diferentes aspectos del registro de errores de la API HTTP.

  • Configurar el registro de errores de la API HTTP
    La configuración del Registro controla los errores de los registros de la API HTTP, el tamaño máximo permitido de los archivos de registro y la ubicación de los archivos de registro.

  • Formato de los registros de errores de la API HTTP
    La API HTTP crea archivos de registro que siguen las convenciones de archivos de registro de World Wide Web Consortium (W3C). Puede usar herramientas estándar para analizar estos archivos de registro. Sin embargo, a diferencia de los archivos de registro W3C, los archivos de registro de la API HTTP no contienen los nombres de las columnas.

  • Tipos de errores que registra la API HTTP
    La API HTTP registra muchos errores comunes.

Los siguientes métodos describen la resolución del registro de errores de la API HTTP.

Configurar el registro de errores de la API HTTP

Tres valores del Registro bajo una clave HTTP \Parameters controlan el registro de errores de la API HTTP. Estas claves se encuentran en la clave del Registro: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters.

Nota

La ubicación y la forma de los valores de configuración pueden cambiar en versiones posteriores del Windows sistema operativo.

Debe tener credenciales de administrador/sistema local para cambiar los valores del Registro y para ver o cambiar los archivos de registro y la carpeta que los contiene.

La información de configuración en los valores del Registro se lee cuando se inicia el controlador de la API HTTP. Por lo tanto, si cambia la configuración, debe detenerse y, a continuación, reiniciar el controlador para leer los nuevos valores. Para ello, escriba los siguientes comandos de consola:

net stop http
net start http

La siguiente convención de nomenclatura se usa para asignar un nombre a los archivos de registro:
httperr + número de secuencia + .log
Ejemplo: httperr4.log

Los archivos de registro se ciclos cuando alcanzan el tamaño máximo que especifica el valor del Registro ErrorLogFileTruncateSize. Este valor no puede ser inferior a 1 megabyte (MB).

Si la configuración del registro de errores no es válida o si se produce algún tipo de error mientras la API HTTP escribe en los archivos de registro, la API HTTP usa el registro de eventos para notificar a los administradores que no se está produciendo el registro de errores.

En la tabla siguiente se describen los valores de configuración del Registro.

Valor del Registro Descripción
EnableErrorLogging Un DWORD que puede establecer en TRUE para habilitar el registro de errores o en FALSE para deshabilitarlo. El valor predeterminado es TRUE.
ErrorLogFileTruncateSize DWORD que especifica el tamaño máximo de un archivo de registro de errores, en bytes. El valor predeterminado es 1 MB (0x100000).

El valor especificado no puede ser menor que el valor predeterminado.
ErrorLoggingDir Una cadena que especifica la carpeta donde la API HTTP coloca sus archivos de registro.

La API HTTP crea una subcarpeta HTTPERR en la carpeta especificada y, a continuación, almacena los archivos de registro en la subcarpeta. Esta subcarpeta y los archivos de registro reciben la misma configuración de permisos. Las cuentas de administrador y de sistema local tienen acceso total. Otros usuarios no tienen acceso.

El siguiente ejemplo es la carpeta predeterminada cuando no se especifica la carpeta en el Registro:
%SystemRoot%\System32\LogFiles

El valor de cadena ErrorLoggingDir debe ser una ruta de acceso local completa. Sin embargo, puede contener %SystemRoot%. No se puede usar una unidad de red o un recurso compartido de red.

Formato de los registros de errores de la API HTTP

Por lo general, los archivos de registro de errores de la API HTTP tienen el mismo formato que los registros de errores de W3C, excepto que los archivos de registro de errores de la API HTTP no contienen encabezados de columna. Cada línea de un registro de errores de la API HTTP registra un error. Los campos aparecen en un orden específico. Un solo carácter de espacio (0x0020) separa cada campo del campo anterior. En cada campo, los signos más (0x002B) reemplazan los caracteres de espacio, las pestañas y los caracteres de control no imprimibles.

En la tabla siguiente se identifican los campos y el orden de los campos de un registro de errores.

Field Descripción
Fecha El campo Fecha sigue el formato W3C. Este campo se basa en la hora universal coordinada (UTC). El campo Fecha siempre tiene 10 caracteres en forma de YYYY-MM-DD. Por ejemplo, el 1 de mayo de 2003 se expresa como 2003-05-01.
Hora El campo Hora sigue el formato W3C. Este campo se basa en UTC. El campo de hora siempre tiene ocho caracteres en forma de MM:HH:SS. Por ejemplo, 5:30 PM (UTC) se expresa como 17:30:00.
Dirección de protocolo de Internet de cliente (IP) La dirección IP del cliente afectado. El valor de este campo puede ser una dirección IPv4 o una dirección IPv6. Si la dirección IP del cliente es una dirección IPv6, el campo ScopeId también se incluye en la dirección.
Puerto de cliente Número de puerto del cliente afectado.
Dirección IP del servidor Dirección IP del servidor afectado. El valor de este campo puede ser una dirección IPv4 o una dirección IPv6. Si la dirección IP del servidor es una dirección IPv6, el campo ScopeId también se incluye en la dirección.
Puerto de servidor Número de puerto del servidor afectado.
Versión del protocolo La versión del protocolo que se está utilizando.

Si la conexión no se ha analizado lo suficiente para determinar la versión del protocolo, se usa un guión (0x002D) como marcador de posición para el campo vacío.

Si el número de versión principal o el número de versión secundaria que se analiza es mayor o igual que 10, la versión se registra como HTTP/?.?.
Verbo El verbo indica la última solicitud que se analiza. Se incluyen verbos desconocidos, pero cualquier verbo con más de 255 bytes se trunca a esta longitud. Si un verbo no está disponible, se usa un guión (0x002D) como marcador de posición para el campo vacío.
CookedURL + Query La dirección URL y cualquier consulta asociada se registran como un campo separado por un signo de interrogación (0x3F). Este campo se trunca con su límite de longitud de 4.096 bytes.

Si esta dirección URL se analiza ("cocinó"), se registra con la conversión de página de código local y se trata como un campo Unicode.

Si esta dirección URL no se ha analizado ("cocinó") en el momento del registro, se copia exactamente, sin ninguna conversión Unicode.

Si la API HTTP no puede analizar esta dirección URL, se usa un guión (0x002D) como marcador de posición para el campo vacío.
Estado del protocolo El estado del protocolo no puede ser mayor que 999.

Si el estado del protocolo de la respuesta a una solicitud está disponible, se registra en este campo.

Si el estado del protocolo no está disponible, se usa un guión (0x002D) como marcador de posición para el campo vacío.
SiteId No se usa en esta versión de la API HTTP. Un guión de marcador de posición (0x002D) siempre aparece en este campo.
Frase de motivo Este campo contiene una cadena que identifica el tipo de error que se está registrando. Este campo nunca se deja vacío.
Nombre de cola Es el nombre de la cola de solicitudes.

Las siguientes líneas de ejemplo son de un registro de errores de la API HTTP:

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

Tipos de errores que registra la API HTTP

La API HTTP registra respuestas de error a clientes, tiempos de espera de conexión, solicitudes huérfanas y conexiones descartadas que se controlan incorrectamente.

En la siguiente lista se identifican los tipos de errores que registra la API HTTP:

  • Respuestas a clientes
    La API HTTP envía una respuesta de error a un cliente, por ejemplo, un error 400 causado por un error de análisis en la última solicitud recibida. Después de que la API HTTP envíe la respuesta de error, cierra la conexión.

  • Tiempos de espera de conexión
    La API HTTP tiene el tiempo de espera de una conexión. Si una solicitud está pendiente cuando se produce el tiempo de espera de la conexión, la solicitud se usa para proporcionar más información sobre la conexión en el registro de errores.

  • Solicitudes huérfanas
    Un proceso de modo de usuario se detiene inesperadamente mientras aún hay solicitudes en cola que se enruten a ese proceso. La API HTTP registra las solicitudes huérfanas en el registro de errores. Los tipos de error específicos se denominan por cadenas de frase de motivo que siempre aparecen como el último campo de cada línea de error. En la tabla siguiente se identifican las frases de motivo de la API HTTP.

Frase de motivo Descripción
AppOffline Se produjo un error de servicio no disponible (un error HTTP 503). El servicio no está disponible porque los errores de la aplicación provocaron que la aplicación se desconectara.
AppPoolTimer Se produjo un error de servicio no disponible (un error HTTP 503). El servicio no está disponible porque el proceso del grupo de aplicaciones está demasiado ocupado para controlar la solicitud.
AppShutdown Se produjo un error de servicio no disponible (un error HTTP 503). El servicio no está disponible porque la aplicación se apaga automáticamente en respuesta a la directiva de administrador.
BadRequest Se produjo un error de análisis al procesar una solicitud.
Client_Reset La conexión entre el cliente y el servidor se cerró antes de que se pudiera asignar la solicitud a un proceso de trabajo. La causa más común de este comportamiento es que el cliente cierra prematuramente su conexión con el servidor.
Connection_Abandoned_By_AppPool Un proceso de trabajo del grupo de aplicaciones ha dejado inesperadamente o huérfana una solicitud pendiente cerrando su identificador.
Connection_Abandoned_By_ReqQueue Un proceso de trabajo del grupo de aplicaciones ha dejado inesperadamente o huérfana una solicitud pendiente cerrando su identificador. Específico para Windows Vista y versiones posteriores y para Windows Server 2008 y versiones posteriores.
Connection_Dropped La conexión entre el cliente y el servidor se cerró antes de que el servidor pudiera enviar su paquete de respuesta final. La causa más común de este comportamiento es que el cliente cierra prematuramente su conexión con el servidor.
Connection_Dropped_List_Full La lista de conexiones descartadas entre los clientes y el servidor está llena. Específico para Windows Vista y versiones posteriores y para Windows Server 2008 y versiones posteriores.
ConnLimit Se produjo un error de servicio no disponible (un error HTTP 503). El servicio no está disponible porque se ha alcanzado o superado el límite de conexión de nivel de sitio.
Connections_Refused La memoria nonPagedPool del kernel ha caído por debajo de 20 MB y http.sys ha dejado de recibir nuevas conexiones
Deshabilitado Se produjo un error de servicio no disponible (un error HTTP 503). El servicio no está disponible porque un administrador ha desconectado la aplicación.
EntityTooLarge Una entidad superó el tamaño máximo permitido.
FieldLength Se superó un límite de longitud de campo.
Prohibido (Forbidden) Se encontró un elemento o secuencia prohibidos durante el análisis.
Encabezado Se produjo un error de análisis en un encabezado.
Nombre de host Se produjo un error de análisis al procesar un nombre de host.
Interno Se produjo un error de servidor interno (un error HTTP 500).
Invalid_CR/LF Se produjo una devolución de carro o una fuente de línea no es así.
LengthRequired Faltaba un valor de longitud necesario.
N/D Se produjo un error de servicio no disponible (un error HTTP 503). El servicio no está disponible porque se produjo un error interno (como un error de asignación de memoria o un conflicto de lista de reserva de direcciones URL).
N/I Se produjo un error no implementado (un error HTTP 501) o se produjo un error de servicio no disponible (un error HTTP 503) debido a una codificación de transferencia desconocida.
Número Se produjo un error de análisis al procesar un número.
Condición previa Faltaba una condición previa necesaria.
QueueFull Se produjo un error de servicio no disponible (un error HTTP 503). El servicio no está disponible porque la cola de solicitudes de aplicación está llena.
RequestLength Se superó un límite de longitud de solicitud.
Timer_AppPool La conexión expiró porque una solicitud esperaba demasiado tiempo en una cola del grupo de aplicaciones para que una aplicación de servidor desa colas y la procesara. Esta duración de tiempo de espera es ConnectionTimeout. De forma predeterminada, este valor se establece en dos minutos.
Timer_ConnectionIdle La conexión expiró y permanece inactiva. La duración predeterminada de ConnectionTimeout es de dos minutos.
Timer_EntityBody La conexión expiró antes de que llegara el cuerpo de la entidad de solicitud. Cuando una solicitud tiene claramente un cuerpo de entidad, la API HTTP activa el temporizador Timer_EntityBody usuario. Al principio, el límite de este temporizador se establece en el valor ConnectionTimeout (normalmente, dos minutos). Cada vez que se recibe otra indicación de datos en esta solicitud, la API HTTP restablece el temporizador para dar a la conexión dos minutos más (o lo que se especifique en ConnectionTimeout).
Timer_HeaderWait La conexión expiró porque el análisis de encabezado de una solicitud tardó más tiempo que el límite predeterminado de dos minutos.
Timer_MinBytesPerSecond La conexión expiró porque el cliente no estaba recibiendo una respuesta a una velocidad razonable. La velocidad de envío de respuesta fue más lenta que la predeterminada de 240 bytes/s. Que se puede controlar con la propiedad de metabase MinFileBytesPerSec.
Timer_ReqQueue La conexión expiró porque una solicitud esperaba demasiado tiempo en una cola del grupo de aplicaciones para que una aplicación de servidor se desa colase. Esta duración de tiempo de espera es ConnectionTimeout. De forma predeterminada, este valor se establece en dos minutos. Específico para Windows Vista y versiones posteriores y para Windows Server 2008 y versiones posteriores.
Timer_Response Reservado. Actualmente no se usa.
Timer_SslRenegotiation
La conexión expiró porque la renegociación de la capa de sockets seguros (SSL) entre el cliente y el servidor tardó más tiempo que el tiempo de espera predeterminado de dos minutos.
URL Se produjo un error de análisis al procesar una dirección URL.
URL_Length Una dirección URL superó el tamaño máximo permitido.
Verbo Se produjo un error de análisis al procesar un verbo.
Version_N/S Se produjo un error de versión no compatible (un error HTTP 505).