查询 NCSA 日志文件格式 - Amazon Athena

查询 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 的更多信息,请参阅《AWS Glue 开发人员指南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/ 打开 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 条目。