W3C 日志记录
W3C 扩展日志记录是可在服务器会话或 URL 组上启用的服务器端日志记录类型。 在 URL 组上启用 W3C 日志记录时,仅对路由到 URL 组的请求执行日志记录。 为每个配置为启用 W3C 日志记录的 URL 组创建单独的日志文件。
在服务器会话上启用 W3C 日志记录时,它充当服务器会话下所有 URL 组的集中式日志记录形式。 为服务器会话中的所有 URL 组维护单个日志文件。
下表列出了 HTTP 服务器 API 可以记录的字段。 表包含 HTTP_LOG_FIELD 常量的子集。 下面列出的某些字段由 HTTP 服务器 API 在内部自动生成,因此不包含在 HTTP_LOG_FIELDS_DATA 结构中。 “显示为”列包含日志文件中显示的文本。 表中的数据按日志文件记录中的出现顺序排列。
未标记为“生成的 HTTP 服务器 API”的字段必须由应用程序在 HTTP_LOG_FIELDS_DATA 结构内传递。 应用程序可以从传递给它的 HTTP_REQUEST 结构生成这些字段。
字段 | 显示为 | 说明 | HTTP_LOG_FIELDS_DATA 成员 | HTTP_LOG_FIELDS常量 |
---|---|---|---|---|
日期 | date | 活动发生的日期。 | 生成的 HTTP 服务器 API。 | HTTP_LOG_FIELD_DATE |
时间 | time | 时间(以协调世界时 (UTC) 发生活动的时间)。 | 生成的 HTTP 服务器 API。 | HTTP_LOG_FIELD_TIME |
服务名称和实例编号 | s-sitename | 客户端上运行的 Internet 服务名称和实例编号。 | ServiceName | HTTP_LOG_FIELD_SITE_NAME |
服务器名称 | s-computername | 生成日志文件条目的服务器的名称。 | ServerName | HTTP_LOG_FIELD_COMPUTER_NAME |
服务器 IP 地址 | s-ip | 生成日志文件条目的服务器的 IP 地址。 | ServerIp | HTTP_LOG_FIELD_SERVER_IP |
方法 | cs-method | 请求的谓词,例如 GET 方法。 | 方法 | HTTP_LOG_FIELD_METHOD |
URI 词干 | cs-uri-stem | 谓词的目标,例如,Default.htm。 | UriStem | HTTP_LOG_FIELD_URI_STEM |
URI 查询 | cs-uri-query | 客户端尝试执行的查询(如果有)。 只有动态页面才需要统一资源标识符 (URI) 查询。 | UriQuery | HTTP_LOG_FIELD_URI_QUERY |
服务器端口 | s-port | 为服务配置的服务器端口号。 | ServerPort | HTTP_LOG_FIELD_SERVER_PORT |
用户名 | cs-username | 访问服务器的经身份验证的用户名。 匿名用户会以连字符表示。 | UserName | HTTP_LOG_FIELD_USER_NAME |
客户端 IP 地址 | c-ip | 发出请求的客户端的 IP 地址。 | ClientIp | HTTP_LOG_FIELD_CLIENT_IP |
协议版本 | cs-version | 客户端使用的 HTTP 协议版本。 | 生成的 HTTP 服务器 API。 | HTTP_LOG_FIELD_VERSION |
用户代理 | cs (User-Agent) | 客户端使用的浏览器类型。 | UserAgent | HTTP_LOG_FIELD_USER_AGENT |
Cookie | cs (Cookie) | 发送或接收的 Cookie 的内容(如果有)。 | Cookie | HTTP_LOG_FIELD_COOKIE |
Referrer | cs (引用) | 用户上次访问的网站。 此站点提供指向当前站点的链接。 | Referrer | HTTP_LOG_FIELD_REFERRER |
主机 | cs-host | 主机标头名称(如果有)。 | 主机 | HTTP_LOG_FIELD_HOST |
HTTP 状态 | sc-status | HTTP 状态代码。 | ProtocolStatus | HTTP_LOG_FIELD_STATUS |
协议子状态 | sc-substatus | 子状态错误代码。 | SubStatus | HTTP_LOG_FIELD_SUB_STATUS |
Win32 状态 | sc-win32-status | Windows 状态代码。 | Win32Status | HTTP_LOG_FIELD_WIN32_STATUS |
发送的字节数 | sc-bytes | 服务器发送的字节数。 | 生成的 HTTP 服务器 API。 | HTTP_LOG_FIELD_BYTES_SENT |
接收的字节数 | cs-bytes | 服务器接收和处理的字节数。 | 生成的 HTTP 服务器 API。 | HTTP_LOG_FIELD_BYTES_RECV |
所用时间 | 所花费的时间 | 操作所用的时间长度(以毫秒为单位)。 | 生成的 HTTP 服务器 API。 | HTTP_LOG_FIELD_TIME_TAKEN |
流 ID | streamid | 流 ID。 | 生成的 HTTP 服务器 API。 | HTTP_LOG_FIELD_STREAM_ID |
日志文件是基于文本的可自定义 ASCII 格式。 文件中的字段前缀定义如下:
前缀 | 说明 |
---|---|
s | 服务器操作。 |
c | 客户端操作。 |
Sc | 服务器到客户端操作。 |
cs | 客户端到服务器操作。 |
应用程序可以选择一个或多个 W3C 扩展日志文件字段,但并非所有字段都将包含信息。 对于已选择但没有任何信息的字段, () 的连字符显示为占位符。 如果字段包含不可打印的字符,HTTP 服务器 API 会将它替换为加号 (+) 以保留日志文件格式。 这通常发生在病毒攻击中,例如,当恶意用户发送回车和换行符时,如果不将其替换为加号 (+) ,则会破坏日志文件的格式。 字段由空格分隔。
如果某个字段由 URL 组或服务器会话启用,但未为请求选择该字段,则该字段会显示在日志文件中,其中包含 () 作为占位符的连字符。
当第一个请求到达 URL 组或服务器会话时,会创建日志文件,在配置日志记录时不会创建日志文件。 以下示例演示启用了客户端 IP、用户名、服务器 IP、服务器端口、方法、URI 词干、URI 查询、状态和用户代理字段的 W3C 日志文件的第一个日志文件条目:
#Software: Microsoft HTTP Server API 2.0
#Version: 1.0 // the log file version as it's described by "https://www.w3.org/TR/WD-logfile".
#Date: 2002-05-02 17:42:15 // when the first log file entry was recorded, which is when the entire log file was created.
#Fields: date time c-ip cs-username s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status cs(User-Agent)
2002-05-02 17:42:15 172.22.255.255 - 172.30.255.255 80 GET /images/picture.jpg - 200 Mozilla/4.0+(compatible;MSIE+5.5;+Windows+2000+Server)
当 HTTP 服务器 API 在分析请求之前收到第一个字节时,将初始化所花费的时间字段。 上次发送完成时,所花费的时间时间戳将停止。 所花费的时间并不反映整个网络的时间。 对站点的第一个请求显示的时间比其他类似请求稍长一些,因为 HTTP 服务器 API 使用第一个请求打开日志文件。