HTTP API 中的日志记录出错

本文介绍超文本传输协议 (HTTP) 应用程序编程接口 (API) 的错误日志记录功能。

原始产品版本:Windows Server 2008 R2、Windows Server 2008、Windows Server 2012 R2、Windows Server 2012、Windows 10 Windows 8.1
原始 KB 编号: 820729

摘要

在基于 HTTP 的应用程序中发生的某些错误由 HTTP API 自动处理,而不是传递回应用程序进行处理。 出现此行为是因为此类错误的频率可能会淹没事件日志或应用程序处理程序。

以下主题介绍了 HTTP API 错误日志记录的不同方面。

以下方法描述了 HTTP API 错误日志记录的解决方法。

配置 HTTP API 错误日志记录

HTTP \Parameters 键下的三个注册表值控制 HTTP API 错误日志记录。 这些键位于注册表项中: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

注意

在更高版本的 Windows 操作系统中,配置值的位置和形式可能会更改。

必须具有管理员/本地系统凭据才能更改注册表值,以及查看或更改日志文件和包含它们的文件夹。

当 HTTP API 驱动程序启动时,将读取注册表值中的配置信息。 因此,如果更改设置,则必须停止,然后重启驱动程序才能读取新值。 为此,请键入以下控制台命令:

net stop http
net start http

以下命名约定用于命名日志文件:
httperr + 序列号 + .log
示例:httperr4.log

当日志文件达到 ErrorLogFileTruncateSize 注册表值指定的最大大小时,将循环使用日志文件。 此值不能小于 1 兆字节 (MB) 。

如果错误日志记录的配置无效,或者 HTTP API 写入日志文件时发生任何类型的故障,则 HTTP API 使用事件日志记录来通知管理员错误日志记录未发生。

下表描述了注册表配置值。

注册表值 说明
EnableErrorLogging 一个 DWORD,可以设置为 TRUE 以启用错误日志记录,或设置为 FALSE 以禁用它。 默认值为 TRUE。
ErrorLogFileTruncateSize 一个 DWORD,指定错误日志文件的最大大小(以字节为单位)。 默认值为 1 MB (0x100000) 。

指定的值不能小于默认值。
ErrorLoggingDir 一个字符串,指定 HTTP API 放置其日志记录文件的文件夹。

HTTP API 在指定的文件夹中创建一个子文件夹 HTTPERR,然后将日志文件存储在子文件夹中。 此子文件夹和日志文件接收相同的权限设置。 管理员和本地系统帐户具有完全访问权限。 其他用户没有访问权限。

在注册表中未指定文件夹时,以下示例是默认文件夹:
%SystemRoot%\System32\LogFiles

ErrorLoggingDir 字符串值必须是完全限定的本地路径。 但是,它可以包含 %SystemRoot%。 无法使用网络驱动器或网络共享。

HTTP API 错误日志的格式

通常,HTTP API 错误日志文件的格式与 W3C 错误日志相同,只是 HTTP API 错误日志文件不包含列标题。 HTTP API 错误日志记录的每一行都会记录一个错误。 字段按特定顺序显示。 单个空格字符 (0x0020) 将每个字段与上一个字段分隔开来。 在每个字段中,加号 (0x002B) 替换空格字符、制表符和不可打印的控制字符。

下表标识了错误日志记录中的字段和字段顺序。

字段 描述
日期 “日期”字段遵循 W3C 格式。 此字段基于协调世界时 (UTC) 。 “日期”字段始终为 10 个字符,格式为 YYYY-MM-DD。 例如,2003 年 5 月 1 日表示为 2003-05-01。
时间 “时间”字段遵循 W3C 格式。 此字段基于 UTC。 时间字段始终采用 MM:HH:SS 格式的八个字符。 例如,下午 5:30 (UTC) 表示为 17:30:00。
客户端 Internet 协议 (IP) 地址 受影响客户端的 IP 地址。 此字段中的值可以是 IPv4 地址或 IPv6 地址。 如果客户端 IP 地址是 IPv6 地址,则地址中也会包含 ScopeId 字段。
客户端端口 受影响客户端的端口号。
服务器 IP 地址 受影响服务器的 IP 地址。 此字段中的值可以是 IPv4 地址或 IPv6 地址。 如果服务器 IP 地址是 IPv6 地址,则地址中也会包含 ScopeId 字段。
服务器端口 受影响服务器的端口号。
协议版本 正在使用的协议的版本。

如果尚未充分分析连接以确定协议版本,则将连字符 (0x002D) 用作空字段的占位符。

如果分析的主版本号或次要版本号大于或等于 10,则版本将记录为 HTTP/?.?.
谓词 谓词表示已分析的最后一个请求传递。 包括未知谓词,但超过 255 字节的任何谓词将被截断为此长度。 如果谓词不可用,则将连字符 (0x002D) 用作空字段的占位符。
CookedURL + 查询 URL 及其关联的任何查询都记录为一个字段,该字段由问号 (0x3F) 分隔。 此字段在长度限制为 4,096 字节时被截断。

如果此 URL 已 (“cooked”) 进行分析,则会使用本地代码页转换进行记录,并被视为 Unicode 字段。

如果在日志记录时未 (“cooked”) 分析此 URL,则会对其进行精确复制,无需进行任何 Unicode 转换。

如果 HTTP API 无法分析此 URL,则将连字符 (0x002D) 用作空字段的占位符。
协议状态 协议状态不能大于 999。

如果对请求的响应的协议状态可用,则会在此字段中记录该响应。

如果协议状态不可用,则将连字符 (0x002D) 用作空字段的占位符。
SiteId 此版本的 HTTP API 中未使用。 此字段中始终显示占位符连字符 (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

HTTP API 记录的错误类型

HTTP API 记录对客户端的错误响应、连接超时、孤立的请求和错误处理的连接删除。

以下列表标识了 HTTP API 记录的错误类型:

  • 对客户端的响应
    HTTP API 向客户端发送错误响应,例如,由上次收到的请求中的分析错误导致的 400 错误。 HTTP API 发送错误响应后,会关闭连接。

  • 连接超时
    HTTP API 超时连接。 如果请求在连接超时时挂起,则请求用于在错误日志中提供有关连接的详细信息。

  • 孤立的请求
    用户模式进程意外停止,同时仍有路由到该进程的排队请求。 HTTP API 在错误日志中记录孤立的请求。特定错误类型由始终显示为每个错误行的最后一个字段的原因短语字符串命名。 下表标识了 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 MB 以下,http.sys 已停止接收新连接
Disabled (HTTP 错误 503) 发生服务不可用错误。 该服务不可用,因为管理员已将应用程序脱机。
EntityTooLarge 实体超出了允许的最大大小。
FieldLength 超出了字段长度限制。
禁止访问 (Forbidden) 分析时满足禁止的元素或序列。
标头 标头中发生分析错误。
主机名称 处理主机名时发生分析错误。
内部 (HTTP 错误 500) 发生内部服务器错误。
Invalid_CR/LF 发生非法回车或换行。
LengthRequired 缺少所需的长度值。
不适用 (HTTP 错误 503) 发生服务不可用错误。 该服务不可用,因为发生内部错误 (例如内存分配失败或 URL 预留列表冲突) 。
不适用 (HTTP 错误 501) 发生未实现的错误,或者由于传输编码未知 (HTTP 错误 503) 发生了服务不可用错误。
数字 处理数字时发生分析错误。
前提 缺少所需的先决条件。
QueueFull (HTTP 错误 503) 发生服务不可用错误。 该服务不可用,因为应用程序请求队列已满。
RequestLength 超出了请求长度限制。
Timer_AppPool 连接已过期,因为请求在应用程序池队列中等待的时间过长,服务器应用程序无法取消排队并进行处理。 此超时持续时间为 ConnectionTimeout。 默认情况下,此值设置为两分钟。
Timer_ConnectionIdle 连接已过期并保持空闲状态。 默认 ConnectionTimeout 持续时间为两分钟。
Timer_EntityBody 连接在请求实体正文到达之前已过期。 当请求明确具有实体正文时,HTTP API 会打开Timer_EntityBody计时器。 首先,此计时器的限制设置为 ConnectionTimeout 值 (通常为两分钟) 。 每次在此请求上收到另一个数据指示时,HTTP API 都会重置计时器,为连接再提供两分钟 (或在 ConnectionTimeout) 中指定的任何内容。
Timer_HeaderWait 连接已过期,因为请求的标头分析花费的时间超过默认限制 2 分钟。
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 (发生版本不支持的错误。