

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 查詢 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、請求接收的時間戳記、用戶端請求的文字、伺服器狀態碼，以及傳回給用戶端之物件的大小。

下列範例會顯示 NCSA 一般日誌格式的資料，如為 IIS 所記錄之內容。

```
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 開發人員指南》**中的[撰寫 Grok 自訂分類器](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-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` 資料表選取請求接收的時間、用戶端請求的文字，以及伺服器狀態碼。`WHERE` 子句會篩選 HTTP 狀態碼 `404` (找不到頁面)。  

```
SELECT request_received_time, client_request, server_status
FROM iis_ncsa_logs
WHERE server_status = '404'
```
下圖顯示 Athena 查詢編輯器中查詢的結果。  

![\[從 Athena 為 HTTP 404 項目查詢 IIS NCSA 日誌。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-iis-logs-3.png)


**Example – 篩選來自特定網域的成功請求**  
下列查詢範例會選取使用者 ID、請求接收時間、用戶端請求的文字，以及 `iis_ncsa_logs` 資料表中的伺服器狀態碼。`WHERE` 子句篩選來自 `200` 網域中使用者的包含 HTTP 狀態碼 `AnyCompany` (成功) 的請求。  

```
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 為 HTTP 200 項目查詢 IIS NCSA 日誌。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/querying-iis-logs-4.png)
