Consultar logs do Apache armazenados no Amazon S3 - Amazon Athena

Consultar logs do Apache armazenados no Amazon S3

Você pode usar o Amazon Athena para consultar arquivos de log do servidor HTTP do Apache armazenados em sua conta do Amazon S3. Este tópico mostra como criar esquemas de tabela para consultar os arquivos de log de acesso do Apache no formato de log comum.

Os campos no formato de log comum incluem endereço IP do cliente, ID do cliente, ID do usuário, carimbo de data/hora de recebimento da solicitação, texto da solicitação do cliente, código de status do servidor e tamanho do objeto retornado ao cliente.

O exemplo de dados a seguir mostra o formato de log comum do Apache.

198.51.100.7 - Li [10/Oct/2019:13:55:36 -0700] "GET /logo.gif HTTP/1.0" 200 232 198.51.100.14 - Jorge [24/Nov/2019:10:49:52 -0700] "GET /index.html HTTP/1.1" 200 2165 198.51.100.22 - Mateo [27/Dec/2019:11:38:12 -0700] "GET /about.html HTTP/1.1" 200 1287 198.51.100.9 - Nikki [11/Jan/2020:11:40:11 -0700] "GET /image.png HTTP/1.1" 404 230 198.51.100.2 - Ana [15/Feb/2019:10:12:22 -0700] "GET /favicon.ico HTTP/1.1" 404 30 198.51.100.13 - Saanvi [14/Mar/2019:11:40:33 -0700] "GET /intro.html HTTP/1.1" 200 1608 198.51.100.11 - Xiulan [22/Apr/2019:10:51:34 -0700] "GET /group/index.html HTTP/1.1" 200 1344

Criar uma tabela no Athena para logs do Apache

Antes de consultar os logs do Apache armazenados no Amazon S3, você deve criar um esquema de tabela para o Athena no qual ele possa ler os dados do log. Para criar uma tabela do Athena de logs do Apache, você pode usar Grok SerDe. Para obter mais informações sobre como usar o SerDe do Grok, consulte Escrever classificadores grok personalizados no Guia do desenvolvedor do AWS Glue.

Para criar uma tabela no Athena para logs do servidor Web do Apache
  1. Abra o console do Athena em https://console.aws.amazon.com/athena/.

  2. Cole a instrução DDL a seguir no editor de consultas do Athena. Modifique os valores em LOCATION 's3://DOC-EXAMPLE-BUCKET/apache-log-folder/' para apontar para seus logs do Apache no Amazon S3.

    CREATE EXTERNAL TABLE apache_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} %{USERNAME: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://DOC-EXAMPLE-BUCKET/apache-log-folder/';
  3. Execute a consulta no console do Athena para registrar a tabela apache_logs. Quando a consulta for concluída, os logs estarão prontos para você consultar no Athena.

Exemplo de consultas select para logs do Apache

exemplo – Filtragem de erros 404

A consulta de exemplo a seguir seleciona a hora de recebimento da solicitação, o texto da solicitação do cliente e o código de status do servidor da tabela apache_logs. A cláusula WHERE filtra o código de status HTTP 404 (página não encontrada).

SELECT request_received_time, client_request, server_status FROM apache_logs WHERE server_status = '404'

A imagem a seguir mostra os resultados da consulta no editor de consultas do Athena.

Consultar entradas HTTP 404 em um log do Apache pelo Athena.
exemplo – Filtragem de solicitações com êxito

A consulta de exemplo a seguir seleciona o ID do usuário, a hora de recebimento da solicitação, o texto da solicitação do cliente e o código de status do servidor da tabela apache_logs. A cláusula WHERE filtra o código de status HTTP 200 (com êxito).

SELECT user_id, request_received_time, client_request, server_status FROM apache_logs WHERE server_status = '200'

A imagem a seguir mostra os resultados da consulta no editor de consultas do Athena.

Consultar entradas HTTP 200 em um log do Apache pelo Athena.
exemplo : filtragem por carimbo de data/hora

O exemplo a seguir consulta registros cujo horário de recebimento da solicitação é superior ao horário no carimbo de data/hora especificado.

SELECT * FROM apache_logs WHERE request_received_time > 10/Oct/2023:00:00:00