W3C extended logging is type of server side logging that can be enabled on the server session or URL group. When W3C logging is enabled on a URL group, logging is performed only on requests that are routed to the URL Group. A separate log file is created for each URL group configured to enable W3C logging.
When W3C logging is enabled on the server session it functions as centralized form of logging for all the URL groups under the server session. A single log file is maintained for all of the URL groups in the server session.
The following table lists the fields that can be logged by the HTTP Server API. The table contains a subset of the HTTP_LOG_FIELD constants. Some of the fields listed below are auto generated by HTTP Server API internally and therefore not contained in the HTTP_LOG_FIELDS_DATA structure. The "Appears As" column contains the text that appears in the log file. The data in the table is in the order of occurrence in the log file record.
Fields that are not marked "HTTP Server API generated" have to be passed inside HTTP_LOG_FIELDS_DATA structure by application. Application could generate those fields from the HTTP_REQUEST structure passed to it.
|Field||Appears As||Description||HTTP_LOG_FIELDS_DATA Member||HTTP_LOG_FIELDS constants|
|Date||date||The date on which the activity occurred.||HTTP Server API generated.||HTTP_LOG_FIELD_DATE|
|Time||time||The time, in coordinated universal time (UTC), at which the activity occurred.||HTTP Server API generated.||HTTP_LOG_FIELD_TIME|
|Service Name and Instance Number||s-sitename||The Internet service name and instance number that was running on the client.||ServiceName||HTTP_LOG_FIELD_SITE_NAME|
|Server Name||s-computername||The name of the server on which the log file entry was generated.||ServerName||HTTP_LOG_FIELD_COMPUTER_NAME|
|Server IP Address||s-ip||The IP address of the server on which the log file entry was generated.||ServerIp||HTTP_LOG_FIELD_SERVER_IP|
|Method||cs-method||The requested verb, for example, a GET method.||Method||HTTP_LOG_FIELD_METHOD|
|URI Stem||cs-uri-stem||The target of the verb, for example, Default.htm.||UriStem||HTTP_LOG_FIELD_URI_STEM|
|URI Query||cs-uri-query||The query, if any, that the client was trying to perform. A Universal Resource Identifier (URI) query is necessary only for dynamic pages.||UriQuery||HTTP_LOG_FIELD_URI_QUERY|
|Server Port||s-port||The server port number that is configured for the service.||ServerPort||HTTP_LOG_FIELD_SERVER_PORT|
|User Name||cs-username||The name of the authenticated user that accessed the server. Anonymous users are indicated by a hyphen.||UserName||HTTP_LOG_FIELD_USER_NAME|
|Client IP Address||c-ip||The IP address of the client that made the request.||ClientIp||HTTP_LOG_FIELD_CLIENT_IP|
|Protocol Version||cs-version||The HTTP protocol version that the client used.||HTTP Server API generated.||HTTP_LOG_FIELD_VERSION|
|User Agent||cs(User-Agent)||The browser type that the client used.||UserAgent||HTTP_LOG_FIELD_USER_AGENT|
|Cookie||cs(Cookie)||The content of the cookie sent or received, if any.||Cookie||HTTP_LOG_FIELD_COOKIE|
|Referrer||cs(Referrer)||The site that the user last visited. This site provided a link to the current site.||Referrer||HTTP_LOG_FIELD_REFERRER|
|Host||cs-host||The host header name, if any.||Host||HTTP_LOG_FIELD_HOST|
|HTTP Status||sc-status||The HTTP status code.||ProtocolStatus||HTTP_LOG_FIELD_STATUS|
|Protocol Substatus||sc-substatus||The substatus error code.||SubStatus||HTTP_LOG_FIELD_SUB_STATUS|
|Win32 Status||sc-win32-status||The Windows status code.||Win32Status||HTTP_LOG_FIELD_WIN32_STATUS|
|Bytes Sent||sc-bytes||The number of bytes sent by the server.||HTTP Server API generated.||HTTP_LOG_FIELD_BYTES_SENT|
|Bytes Received||cs-bytes||The number of bytes received and processed by the server.||HTTP Server API generated.||HTTP_LOG_FIELD_BYTES_RECV|
|Time Taken||time-taken||The length of time that the action took, in milliseconds.||HTTP Server API generated.||HTTP_LOG_FIELD_TIME_TAKEN|
|Stream ID||streamid||The Stream Id.||HTTP Server API generated.||HTTP_LOG_FIELD_STREAM_ID|
The log file is a customizable ASCII text-based format. The field prefixes in the file are defined as follows:
The application can select one or more of the W3C Extended log file fields, however, not all fields will contain information. For fields that are selected but for which there is no information, a hyphen (-) appears as a placeholder. If a field contains a nonprintable character, the HTTP Server API replaces it with a plus sign (+) to preserve the log file format. This typically occurs with virus attacks, when, for example, a malicious user sends carriage returns and line feeds that, if not replaced with the plus sign (+), would break the log file format. Fields are separated by spaces.
If a field is enabled by the URL group or server session, but not selected for the request, it appears in the log file with a hyphen (-) as a placeholder.
Log files are created when the first request arrives on the URL Group or server session, they are not created when logging is configured. The following example shows the first log file entry for a W3C log file with the Client IP, Username, Server IP, Server Port, Method, URI Stem, URI Query, Status, and User Agent fields enabled:
#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)
The time-taken field is initialized when the HTTP Server API receives the first byte, before the request is parsed. The time-taken timestamp is stopped when the last send completion occurs. Time-taken does not reflect time across the network. The first request to the site shows a slightly longer time taken than other similar requests because the HTTP Server API opens the log file with the first request.