查询 NCSA 日志文件格式 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

查询 NCSA 日志文件格式

IIS 还使用 NCSA 日志记录格式,该格式具有固定数量的 ASCII 文本格式的字段,以空格分隔。该结构与用于 Apache 访问日志的常用日志格式类似。NCSA 常用日志数据格式中的字段包括客户端 IP 地址、客户端 ID(通常不使用)、域\用户 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 日志创建表

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

要在 Athena 中为 IIS NCSA Web 服务器日志创建表
  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

  2. 将以下 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/';
  3. 在 Athena 控制台中运行查询以注册 iis_ncsa_logs 表。查询完成后,调查结果准备就绪,可供您从 Athena 查询。

IIS NCSA 日志的选择查询示例

例 – 筛选 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 条目。
例 – 筛选来自特定域的成功请求

以下的示例查询从 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 条目。