查询 W3C 扩展日志文件格式
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 扩展日志创建表
在查询 W3C 扩展日志之前,必须先创建表架构,以便 Athena 可以读取日志数据。
要在 Athena 中为 W3C 扩展日志创建表
从 https://console.aws.amazon.com/athena/
打开 Athena 控制台。 -
将类似以下内容的 DDL 语句粘贴到 Athena 控制台中,并注意以下几点:
-
在示例中添加或删除列,以便与要查询的日志中的字段对应。
-
W3C 扩展日志文件格式的列名称包含连字符 (
-)。然而,根据 Athena 命名约定,示例CREATE TABLE语句将用下划线 (_) 替换连字符。 -
要指定空格分隔符,请使用
FIELDS TERMINATED BY ' '。 -
修改
LOCATION 's3://amzn-s3-demo-bucket/中的值以指向您在 Amazon S3 中的 W3C 扩展日志。w3c-log-folder/'
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/' -
-
在 Athena 控制台中运行查询以注册
iis_w3c_logs表。查询完成后,调查结果准备就绪,可供您从 Athena 查询。
示例 W3C 扩展日志选择查询
以下示例查询从表 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 查询编辑器中的查询结果。
合并日期和时间字段
以空格分隔的 date 和 time 字段是日志源数据中的单独条目,但您可以根据需要将它们合并到时间戳中。在 SELECT 或者 CREATE TABLE AS SELECT 查询中使用 concat()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'
下图显示了查询的结果。