

# 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 拡張ログに表示されるフィールドは、どのログフィールドを含めるかを選択するウェブサーバー管理者によって決定されます。以下のログデータ例には、`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 拡張ログファイル形式の列名にはハイフン (`-`) が含まれていますが、例の `CREATE TABLE` ステートメントは、[Athena の命名規則](tables-databases-columns-names.md)に従って、それらをアンダースコア (`_`) に置き換えます。

   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/ja_jp/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/ja_jp/athena/latest/ug/images/querying-iis-logs-1a.png)
