

# 查询 W3C 扩展日志文件格式
<a name="querying-iis-logs-w3c-extended-log-file-format"></a>

[W3C 扩展](https://docs.microsoft.com/en-us/windows/win32/http/w3c-logging)日志文件数据格式具有空格分隔的字段。W3C 扩展日志中显示的字段由 Web 服务器管理员决定，后者将选择要包含哪些日志字段。以下示例日志数据具有 `date, time`、`c-ip`、`s-ip`、`cs-method`、`cs-uri-stem`、`sc-status`、`sc-bytes`、`cs-bytes`、`time-taken` 和 `cs-version` 字段。

```
2020-01-19 22:48:39 203.0.113.5 198.51.100.2 GET /default.html 200 540 524 157 HTTP/1.0
2020-01-19 22:49:40 203.0.113.10 198.51.100.12 GET /index.html 200 420 324 164 HTTP/1.0
2020-01-19 22:50:12 203.0.113.12 198.51.100.4 GET /image.gif 200 324 320 358 HTTP/1.0
2020-01-19 22:51:44 203.0.113.15 198.51.100.16 GET /faq.html 200 330 324 288 HTTP/1.0
```

## 在 Athena 中为 W3C 扩展日志创建表
<a name="querying-iis-logs-creating-a-table-in-athena-for-w3c-extended-logs"></a>

在查询 W3C 扩展日志之前，必须先创建表架构，以便 Athena 可以读取日志数据。

**要在 Athena 中为 W3C 扩展日志创建表**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 将类似以下内容的 DDL 语句粘贴到 Athena 控制台中，并注意以下几点：

   1. 在示例中添加或删除列，以便与要查询的日志中的字段对应。

   1. W3C 扩展日志文件格式的列名称包含连字符 (`-`)。然而，根据 [Athena 命名约定](tables-databases-columns-names.md)，示例 `CREATE TABLE` 语句将用下划线 (`_`) 替换连字符。

   1. 要指定空格分隔符，请使用 `FIELDS TERMINATED BY ' '`。

   1. 修改 `LOCATION 's3://amzn-s3-demo-bucket/w3c-log-folder/'` 中的值以指向您在 Amazon S3 中的 W3C 扩展日志。

   ```
   CREATE EXTERNAL TABLE `iis_w3c_logs`( 
     date_col string, 
     time_col string, 
     c_ip string,
     s_ip string,
     cs_method string, 
     cs_uri_stem string, 
     sc_status string,
     sc_bytes string,
     cs_bytes string,
     time_taken string,
     cs_version string
     ) 
   ROW FORMAT DELIMITED  
     FIELDS TERMINATED BY ' '  
   STORED AS INPUTFORMAT  
     'org.apache.hadoop.mapred.TextInputFormat'  
   OUTPUTFORMAT  
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
   LOCATION   's3://amzn-s3-demo-bucket/w3c-log-folder/'
   ```

1. 在 Athena 控制台中运行查询以注册 `iis_w3c_logs` 表。查询完成后，调查结果准备就绪，可供您从 Athena 查询。

## 示例 W3C 扩展日志选择查询
<a name="querying-iis-logs-example-w3c-extended-log-select-query"></a>

以下示例查询从表 `iis_w3c_logs` 中选择了请求的日期、时间、请求目标和用时。`WHERE` 子句筛选条件，用于 HTTP 方法为 `GET`，以及 HTTP 状态代码为 `200`（成功）的情况。

```
SELECT date_col, time_col, cs_uri_stem, time_taken
FROM iis_w3c_logs
WHERE cs_method = 'GET' AND sc_status = '200'
```

下图显示了 Athena 查询编辑器中的查询结果。

![\[存储在 Amazon S3 中的 W3C 扩展日志文件的 Athena 示例查询结果。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-iis-logs-1.png)


## 合并日期和时间字段
<a name="querying-iis-logs-example-w3c-extended-log-combining-date-and-time"></a>

以空格分隔的 `date` 和 `time` 字段是日志源数据中的单独条目，但您可以根据需要将它们合并到时间戳中。在 [SELECT](select.md) 或者 [CREATE TABLE AS SELECT](create-table-as.md) 查询中使用 [concat()](https://prestodb.io/docs/current/functions/string.html#concat) 和 [date\$1parse()](https://prestodb.io/docs/current/functions/datetime.html#date_parse) 函数来连接日期和时间列并将其转换为时间戳格式。以下示例使用 CTAS 查询创建一个新表，其中包含 `derived_timestamp` 列。

```
CREATE TABLE iis_w3c_logs_w_timestamp AS
SELECT 
  date_parse(concat(date_col,' ', time_col),'%Y-%m-%d %H:%i:%s') as derived_timestamp, 
  c_ip, 
  s_ip, 
  cs_method, 
  cs_uri_stem, 
  sc_status, 
  sc_bytes, 
  cs_bytes, 
  time_taken, 
  cs_version
FROM iis_w3c_logs
```

创建表后，您可以直接查询新的时间戳列，如以下示例所示。

```
SELECT derived_timestamp, cs_uri_stem, time_taken
FROM iis_w3c_logs_w_timestamp
WHERE cs_method = 'GET' AND sc_status = '200'
```

下图显示了查询的结果。

![\[具有派生时间戳列的表上的 W3C 扩展日志文件查询结果。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-iis-logs-1a.png)
