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 문에는 Apache 웹 서버 로그의 경우와 비슷한 Grok SerDe 및 grok 패턴을 사용할 수 있습니다. Apache 로그와 달리, grok 패턴은 domain\user_id에서 백슬래시의 존재를 설명하기 위해 세 번째 필드에 대해 %{USERNAME:user_id} 대신 %{DATA:user_id}를 사용합니다. Grok SerDe를 사용하는 방법에 대한 자세한 내용은 AWS Glue 개발자 안내서Grok 사용자 지정 분류자 작성을 참조하세요.

Athena에서 IIS NCSA 웹 서버 로그에 대한 테이블 생성
  1. https://console.aws.amazon.com/athena/에서 Athena 콘솔을 엽니다.

  2. 다음의 DDL 문을 Athena 쿼리 편집기에 붙여 넣습니다. Amazon S3의 IIS NCSA 로그를 가리키도록 LOCATION 's3://amzn-s3-demo-bucket/iis-ncsa-logs/'의 값을 수정합니다.

    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 테이블에서 요청 수신 시간, 클라이언트 요청의 텍스트 및 서버 상태 코드를 선택합니다. 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 로그 쿼리.
예 - 특정 도메인의 성공적인 요청에 대한 필터링

다음 쿼리 예제는 iis_ncsa_logs 테이블에서 사용자 ID, 요청 수신 시간, 클라이언트 요청의 텍스트 및 서버 상태 코드를 선택합니다. WHERE 절은 HTTP 상태 코드 200(성공)을 가진 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 로그 쿼리.