

# 查询 NCSA 日志文件格式
<a name="querying-iis-logs-ncsa-log-file-format"></a>

IIS 还使用 [NCSA 日志记录](https://docs.microsoft.com/en-us/windows/win32/http/ncsa-logging)格式，该格式具有固定数量的 ASCII 文本格式的字段，以空格分隔。该结构与用于 Apache 访问日志的常用日志格式类似。NCSA 常用日志数据格式中的字段包括客户端 IP 地址、客户端 ID（通常不使用）、域\$1用户 ID、接收请求的时间戳、客户端请求的文本、服务器状态代码以及返回给客户端的对象的大小。

以下示例显示了 IIS 所记录的 NCSA 常用日志格式的数据。

```
198.51.100.7 - ExampleCorp\Li [10/Oct/2019:13:55:36 -0700] "GET /logo.gif HTTP/1.0" 200 232
198.51.100.14 - AnyCompany\Jorge [24/Nov/2019:10:49:52 -0700] "GET /index.html HTTP/1.1" 200 2165
198.51.100.22 - ExampleCorp\Mateo [27/Dec/2019:11:38:12 -0700] "GET /about.html HTTP/1.1" 200 1287
198.51.100.9 - AnyCompany\Nikki [11/Jan/2020:11:40:11 -0700] "GET /image.png HTTP/1.1" 404 230
198.51.100.2 - ExampleCorp\Ana [15/Feb/2019:10:12:22 -0700] "GET /favicon.ico HTTP/1.1" 404 30
198.51.100.13 - AnyCompany\Saanvi [14/Mar/2019:11:40:33 -0700] "GET /intro.html HTTP/1.1" 200 1608
198.51.100.11 - ExampleCorp\Xiulan [22/Apr/2019:10:51:34 -0700] "GET /group/index.html HTTP/1.1" 200 1344
```

## 在 Athena 中为 IIS NCSA 日志创建表
<a name="querying-iis-logs-ncsa-creating-a-table-in-athena"></a>

对于您的 `CREATE TABLE` 语句，则可以使用 [Grok SerDe](grok-serde.md) 和一个类似于 [Apache Web 服务器日志](querying-apache-logs.md)模式的 grok 模式。与 Apache 日志不同，grok 模式使用 `%{DATA:user_id}` 而不是 `%{USERNAME:user_id}` 作为第三个字段来考虑 `domain\user_id` 中反斜杠的存在。有关使用 Grok SerDe 的更多信息，请参阅《AWS Glue 开发人员指南[https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-grok](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-grok)》中的 *编写 Grok 自定义分类器*。

**要在 Athena 中为 IIS NCSA Web 服务器日志创建表**

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

1. 将以下 DDL 语句粘贴到 Athena 查询编辑器中。修改 `LOCATION 's3://amzn-s3-demo-bucket/iis-ncsa-logs/'` 中的值以指向 Amazon S3 中的 IIS NCSA 日志。

   ```
   CREATE EXTERNAL TABLE iis_ncsa_logs(
     client_ip string,
     client_id string,
     user_id string,
     request_received_time string,
     client_request string,
     server_status string,
     returned_obj_size string
     )
   ROW FORMAT SERDE
      'com.amazonaws.glue.serde.GrokSerDe'
   WITH SERDEPROPERTIES (
      'input.format'='^%{IPV4:client_ip} %{DATA:client_id} %{DATA:user_id} %{GREEDYDATA:request_received_time} %{QUOTEDSTRING:client_request} %{DATA:server_status} %{DATA: returned_obj_size}$'
      )
   STORED AS INPUTFORMAT
      'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
      'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
      's3://amzn-s3-demo-bucket/iis-ncsa-logs/';
   ```

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

## IIS NCSA 日志的选择查询示例
<a name="querying-iis-logs-ncsa-example-select-queries"></a>

**Example – 筛选 404 错误**  
以下的示例查询从 `iis_ncsa_logs` 表中选择了请求接收时间、客户端请求的文本以及服务器状态代码。HTTP 状态代码 `404`（未找到页面）的 `WHERE` 子句筛选条件。  

```
SELECT request_received_time, client_request, server_status
FROM iis_ncsa_logs
WHERE server_status = '404'
```
下图显示了 Athena 查询编辑器中的查询结果。  

![\[从 Athena 查询 IIS NCSA 日志的 HTTP 404 条目。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-iis-logs-3.png)


**Example – 筛选来自特定域的成功请求**  
以下的示例查询从 `iis_ncsa_logs` 表中选择了用户 ID、请求接收时间、客户端请求的文本以及服务器状态代码。`WHERE` 子句筛选来自 `AnyCompany` 域中用户且具有 HTTP 状态代码 `200`（成功）的请求。  

```
SELECT user_id, request_received_time, client_request, server_status
FROM iis_ncsa_logs
WHERE server_status = '200' AND user_id LIKE 'AnyCompany%'
```
下图显示了 Athena 查询编辑器中的查询结果。  

![\[从 Athena 查询 IIS NCSA 日志的 HTTP 200 条目。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/querying-iis-logs-4.png)
