配置 HTTPERR 错误日志记录,不断增长会沾满C盘导致服务器停机
配置 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 | 可以设置为 TRUE 以启用错误日志记录的 DWORD,或设置为 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 形式的 8 个字符。 例如,下午 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,则会使用本地代码页转换记录该 URL,并将其视为 Unicode 字段。 如果在日志记录时未 (“煮熟”) 分析此 URL,则会完全复制该 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 预留列表冲突等内部错误 (。 |
N/I | 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 | 连接已过期,因为请求的标头分析所花费的时间超过两分钟的默认限制。 |
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) (出现版本不受支持的错误。 |