

# Consultar logs do Application Load Balancer
<a name="application-load-balancer-logs"></a>

O Application Load Balancer é uma opção de balanceamento de carga do Elastic Load Balancing que habilita a distribuição de tráfego em uma implantação de microsserviços usando contêineres. Consultar logs do Application Load Balancer permite consultar a origem do tráfego, a latência e os bytes transferidos de e para instâncias do Elastic Load Balancing e aplicativos de backend. Para obter mais informações, consulte [Logs de acesso para seu Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html) e [Logs de conexão para seu Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html) no *Guia do usuário para Application Load Balancers*.

## Pré-requisitos
<a name="application-load-balancer-logs-prerequisites"></a>
+ Habilite o [registro de acesso em log](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html) ou [registro de conexão em log](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html) para permitir que os logs do Application Load Balancer sejam salvos no seu bucket do Amazon S3.
+ Um banco de dados para conter a tabela que você criará para o Athena. Para criar um banco de dados, é possível usar o Athena ou o console do AWS Glue. Para obter mais informações, consulte [Criar bancos de dados no Athena](creating-databases.md) neste guia ou [Trabalhar com banco de dados no console do AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/console-databases.html), no *Guia do desenvolvedor do AWS Glue*. 

**Topics**
+ [Pré-requisitos](#application-load-balancer-logs-prerequisites)
+ [Criar a tabela para logs de acesso do ALB](create-alb-access-logs-table.md)
+ [Criar a tabela para logs de acesso do ALB no Athena com uso da projeção de partições](create-alb-access-logs-table-partition-projection.md)
+ [Exemplos de consultas para logs de acesso do ALB](query-alb-access-logs-examples.md)
+ [Criar a tabela para logs de conexão do ALB](create-alb-connection-logs-table.md)
+ [Criar a tabela para logs de conexão do ALB no Athena com uso da projeção de partições](create-alb-connection-logs-table-partition-projection.md)
+ [Exemplo de consultas para logs de conexão do ALB](query-alb-connection-logs-examples.md)
+ [Recursos adicionais](application-load-balancer-logs-additional-resources.md)

# Criar a tabela para logs de acesso do ALB
<a name="create-alb-access-logs-table"></a>

1. Copie e cole a declaração `CREATE TABLE` a seguir em um editor de consulta no console do Athena e modifique-a conforme necessário para seus próprios requisitos de entrada de log. Para obter mais informações sobre os conceitos básicos do Athena, consulte [Conceitos básicos](getting-started.md). Substitua o caminho na cláusula `LOCATION` pela localização da pasta de log de acesso do Amazon S3. Para obter mais informações sobre o local do arquivo de log de acesso, consulte [Arquivos de log de acesso](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-file-format) no *Guia do usuário para Application Load Balancers*.

   Para obter informações sobre cada campo do arquivo de log, consulte [Entradas do log de acesso](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format) no *Guia do usuário para Application Load Balancers*.
**nota**  
A declaração de exemplo `CREATE TABLE` a seguir inclui as colunas `classification`, `classification_reason` e `conn_trace_id` (“ID de rastreabilidade” ou TID) adicionadas recentemente. Para criar uma tabela dos logs de acesso do Application Load Balancer que não contenham essas entradas, remova as colunas correspondentes da instrução `CREATE TABLE` e modifique a expressão regex de acordo. 

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_logs (
               type string,
               time string,
               elb string,
               client_ip string,
               client_port int,
               target_ip string,
               target_port int,
               request_processing_time double,
               target_processing_time double,
               response_processing_time double,
               elb_status_code int,
               target_status_code string,
               received_bytes bigint,
               sent_bytes bigint,
               request_verb string,
               request_url string,
               request_proto string,
               user_agent string,
               ssl_cipher string,
               ssl_protocol string,
               target_group_arn string,
               trace_id string,
               domain_name string,
               chosen_cert_arn string,
               matched_rule_priority string,
               request_creation_time string,
               actions_executed string,
               redirect_url string,
               lambda_error_reason string,
               target_port_list string,
               target_status_code_list string,
               classification string,
               classification_reason string,
               conn_trace_id string
               )
               ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
               WITH SERDEPROPERTIES (
               'serialization.format' = '1',
               'input.regex' = 
           '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\\s]+?)\" \"([^\\s]+)\" \"([^ ]*)\" \"([^ ]*)\" ?([^ ]*)? ?( .*)?'
               )
               LOCATION 's3://amzn-s3-demo-bucket/access-log-folder-path/'
   ```
**nota**  
Sugerimos que o padrão *`?( .*)?`* no final do parâmetro `input.regex` permaneça sempre em vigor para lidar com futuras entradas de registro, caso novos campos de log do ALB sejam adicionados. 

1. Execute a consulta no console do Athena. Depois que a consulta for concluída, o Athena registrará a tabela `alb_access_logs`, preparando os dados dela para você fazer as consultas.

# Criar a tabela para logs de acesso do ALB no Athena com uso da projeção de partições
<a name="create-alb-access-logs-table-partition-projection"></a>

Como os logs de acesso do ALB têm uma estrutura conhecida com um esquema de partição que você pode especificar antecipadamente, é possível reduzir o runtime das consultas e automatizar o gerenciamento de partições usando o atributo de projeção de partições do Athena. A projeção de partições adiciona automaticamente novas partições à medida que os dados são adicionados. Isso elimina a necessidade de adicionar manualmente as partições usando `ALTER TABLE ADD PARTITION`. 

O exemplo de instrução `CREATE TABLE` a seguir usa automaticamente a projeção de partições com base em logs de acesso do ALB a partir de uma data especificada até o dia atual para uma única região da AWS. A instrução é baseada no exemplo da seção anterior, mas adiciona as cláusulas `PARTITIONED BY` e `TBLPROPERTIES` para habilitar a projeção de partições. Nas cláusulas `LOCATION` e `storage.location.template`, substitua os espaços reservados pelos valores que identificam o local do bucket do Amazon S3 dos seus logs de acesso do ABL. Para obter mais informações sobre o local do arquivo de log de acesso, consulte [Arquivos de log de acesso](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-file-format) no *Guia do usuário para Application Load Balancers*. Em ‭`projection.day.range`‬, substitua ‭‭*01‭*‬/‭*01‭*‬/*2022* pela data de início que você deseja usar. Depois que você executar a consulta com êxito, poderá consultar a tabela. Você não precisa executar `ALTER TABLE ADD PARTITION` para carregar as partições. Para obter informações sobre cada campo do arquivo de log, consulte [Entradas de log de acesso](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format). 

```
CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_logs (
            type string,
            time string,
            elb string,
            client_ip string,
            client_port int,
            target_ip string,
            target_port int,
            request_processing_time double,
            target_processing_time double,
            response_processing_time double,
            elb_status_code int,
            target_status_code string,
            received_bytes bigint,
            sent_bytes bigint,
            request_verb string,
            request_url string,
            request_proto string,
            user_agent string,
            ssl_cipher string,
            ssl_protocol string,
            target_group_arn string,
            trace_id string,
            domain_name string,
            chosen_cert_arn string,
            matched_rule_priority string,
            request_creation_time string,
            actions_executed string,
            redirect_url string,
            lambda_error_reason string,
            target_port_list string,
            target_status_code_list string,
            classification string,
            classification_reason string,
            conn_trace_id string
            )
            PARTITIONED BY
            (
             day STRING
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' = 
        '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\\s]+?)\" \"([^\\s]+)\" \"([^ ]*)\" \"([^ ]*)\" ?([^ ]*)? ?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/'
            TBLPROPERTIES
            (
             "projection.enabled" = "true",
             "projection.day.type" = "date",
             "projection.day.range" = "2022/01/01,NOW",
             "projection.day.format" = "yyyy/MM/dd",
             "projection.day.interval" = "1",
             "projection.day.interval.unit" = "DAYS",
             "storage.location.template" = "s3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}"
            )
```

Para obter mais informações sobre projeção de partições, consulte [Usar projeção de partições com o Amazon Athena](partition-projection.md).

**nota**  
Sugerimos que o padrão *?( .\$1)?* no final do parâmetro `input.regex` permaneça sempre aplicado para lidar com futuras entradas de log, caso novos campos de log do ALB sejam adicionados. 

# Exemplos de consultas para logs de acesso do ALB
<a name="query-alb-access-logs-examples"></a>

A consulta a seguir conta o número de solicitações HTTP GET recebidas pelo load balancer agrupadas pelo endereço IP do cliente:

```
SELECT COUNT(request_verb) AS
 count,
 request_verb,
 client_ip
FROM alb_access_logs
GROUP BY request_verb, client_ip
LIMIT 100;
```

Outra consulta mostra os URLs visitados por usuários do navegador Safari:

```
SELECT request_url
FROM alb_access_logs
WHERE user_agent LIKE '%Safari%'
LIMIT 10;
```

A consulta a seguir mostra registros que têm valores de código de status ELB maiores ou iguais a 500.

```
SELECT * FROM alb_access_logs
WHERE elb_status_code >= 500
```

O exemplo a seguir mostra como analisar os registros por `datetime`:

```
SELECT client_ip, sum(received_bytes) 
FROM alb_access_logs
WHERE parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') 
     BETWEEN parse_datetime('2018-05-30-12:00:00','yyyy-MM-dd-HH:mm:ss') 
     AND parse_datetime('2018-05-31-00:00:00','yyyy-MM-dd-HH:mm:ss') 
GROUP BY client_ip;
```

O exemplo a seguir consulta a tabela que usa projeção de partição para todos os logs de acesso do ALB a partir do dia especificado.

```
SELECT * 
FROM alb_access_logs 
WHERE day = '2022/02/12'
```

# Criar a tabela para logs de conexão do ALB
<a name="create-alb-connection-logs-table"></a>

1. Copie e cole o exemplo de declaração `CREATE TABLE` a seguir em um editor de consulta no console do Athena e modifique-a conforme necessário para seus próprios requisitos de entrada de log. Para obter mais informações sobre os conceitos básicos do Athena, consulte [Conceitos básicos](getting-started.md). Substitua o caminho na cláusula `LOCATION` pela localização da pasta de log de conexão do Amazon S3. Para obter mais informações sobre o local do arquivo de log de conexão, consulte [Arquivos de log de conexão](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-file-format) no *Guia do usuário para Application Load Balancers*. Para obter informações sobre cada campo do arquivo de log, consulte [Entradas de log de conexão](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-entry-format). 

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs (
            time string,
            client_ip string,
            client_port int,
            listener_port int,
            tls_protocol string,
            tls_cipher string,
            tls_handshake_latency double,
            leaf_client_cert_subject string,
            leaf_client_cert_validity string,
            leaf_client_cert_serial_number string,
            tls_verify_status string,
            conn_trace_id string
            ) 
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' =
             '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/connection-log-folder-path/'
   ```

1. Execute a consulta no console do Athena. Depois que a consulta for concluída, o Athena registrará a tabela `alb_connection_logs`, preparando os dados dela para você fazer as consultas.

# Criar a tabela para logs de conexão do ALB no Athena com uso da projeção de partições
<a name="create-alb-connection-logs-table-partition-projection"></a>

Como os logs de conexão do ALB têm uma estrutura conhecida com um esquema de partição que você pode especificar antecipadamente, é possível reduzir o runtime das consultas e automatizar o gerenciamento de partições usando o atributo de projeção de partições do Athena. A projeção de partições adiciona automaticamente novas partições à medida que os dados são adicionados. Isso elimina a necessidade de adicionar manualmente as partições usando `ALTER TABLE ADD PARTITION`. 

O exemplo de instrução `CREATE TABLE` a seguir usa automaticamente a projeção de partições com base em logs de conexão do ALB a partir de uma data especificada até o dia atual para uma única região da AWS. A instrução é baseada no exemplo da seção anterior, mas adiciona as cláusulas `PARTITIONED BY` e `TBLPROPERTIES` para habilitar a projeção de partições. Nas cláusulas `LOCATION` e `storage.location.template`, substitua os espaços reservados pelos valores que identificam o local do bucket do Amazon S3 dos seus logs de conexão do ABL. Para obter mais informações sobre o local do arquivo de log de conexão, consulte [Arquivos de log de conexão](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-file-format) no *Guia do usuário para Application Load Balancers*. Em ‭`projection.day.range`‬, substitua ‭*01‭*‬/‭*01‭*/‬*2023* pela data de início que você deseja usar. Depois que você executar a consulta com êxito, poderá consultar a tabela. Você não precisa executar `ALTER TABLE ADD PARTITION` para carregar as partições. Para obter informações sobre cada campo do arquivo de log, consulte [Entradas de log de conexão](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-connection-logs.html#connection-log-entry-format).

```
CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs (
         time string,
         client_ip string,
         client_port int,
         listener_port int,
         tls_protocol string,
         tls_cipher string,
         tls_handshake_latency double,
         leaf_client_cert_subject string,
         leaf_client_cert_validity string,
         leaf_client_cert_serial_number string,
         tls_verify_status string,
         conn_trace_id string
         )
            PARTITIONED BY
            (
             day STRING
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' =
             '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/'
            TBLPROPERTIES
            (
             "projection.enabled" = "true",
             "projection.day.type" = "date",
             "projection.day.range" = "2023/01/01,NOW",
             "projection.day.format" = "yyyy/MM/dd",
             "projection.day.interval" = "1",
             "projection.day.interval.unit" = "DAYS",
             "storage.location.template" = "s3://amzn-s3-demo-bucket/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}"
            )
```

Para obter mais informações sobre projeção de partições, consulte [Usar projeção de partições com o Amazon Athena](partition-projection.md).

# Exemplo de consultas para logs de conexão do ALB
<a name="query-alb-connection-logs-examples"></a>

A consulta a seguir conta as ocorrências nas quais o valor de `tls_verify_status` não foi `'Success'`, agrupadas por endereço IP do cliente:

```
SELECT DISTINCT client_ip, count() AS count FROM alb_connection_logs
WHERE tls_verify_status != 'Success'
GROUP BY client_ip
ORDER BY count() DESC;
```

A consulta a seguir pesquisa ocorrências nas quais o valor de `tls_handshake_latency` foi superior a 2 segundos no intervalo de tempo especificado:

```
SELECT * FROM alb_connection_logs
WHERE 
  (
    parse_datetime(time, 'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') 
    BETWEEN 
    parse_datetime('2024-01-01-00:00:00', 'yyyy-MM-dd-HH:mm:ss') 
    AND 
    parse_datetime('2024-03-20-00:00:00', 'yyyy-MM-dd-HH:mm:ss') 
  ) 
  AND 
    (tls_handshake_latency >= 2.0);
```

# Recursos adicionais
<a name="application-load-balancer-logs-additional-resources"></a>

Para obter mais informações sobre o uso de logs do ALB, consulte os recursos a seguir.
+ [Como analisar os logs de acesso do meu Application Load Balancer usando o Amazon Athena](https://repost.aws/knowledge-center/athena-analyze-access-logs) no *Centro de Conhecimentos da AWS*.
+ Para obter informações sobre códigos de status HTTP do Elastic Load Balancing, consulte [Solução de problemas em Application Load Balancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html) no *Guia do usuário para Application Load Balancers*.
+ [Catalogue e analise os logs do Application Load Balancer com mais eficiência com classificadores personalizados AWS Glue e Amazon Athena](https://aws.amazon.com/blogs/big-data/catalog-and-analyze-application-load-balancer-logs-more-efficiently-with-aws-glue-custom-classifiers-and-amazon-athena/) no *Blog de Big Data da AWS*.