

# Registrar em log e monitorar funções do Lambda em C\$1
<a name="csharp-logging"></a>

O AWS Lambda monitora automaticamente as funções do Lambda e envia entradas de logs para o Amazon CloudWatch. Sua função do Lambda vem com um grupo de logs do CloudWatch Logs e uma transmissão de logs para cada instância de sua função. O ambiente de runtime do Lambda envia detalhes sobre cada invocação e outras saídas do código da função para o fluxo de logs. Para obter mais informações sobre o CloudWatch Logs, consulte [Enviar logs de função do Lambda para o CloudWatch Logs](monitoring-cloudwatchlogs.md).

**Topics**
+ [Criar uma função que retorna logs](#csharp-logging-output)
+ [Uso de controles avançados de registro em log do Lambda com .NET](#csharp-logging-advanced)
+ [Outras ferramentas de geração de log e bibliotecas](#csharp-tools-libraries)
+ [Uso do Powertools para AWS Lambda (.NET) e do AWS SAM para registro em log estruturado](#dotnet-logging-sam)
+ [Visualizar logs no console do Lambda](#csharp-logging-console)
+ [Visualização de logs no console do CloudWatch](#csharp-logging-cwconsole)
+ [Visualizar logs usando a AWS Command Line Interface (AWS CLI)](#csharp-logging-cli)
+ [Excluir logs](#csharp-logging-delete)

## Criar uma função que retorna logs
<a name="csharp-logging-output"></a>

Para gerar os logs do código de função, você pode usar o [ILambdaLogger](https://github.com/aws/aws-lambda-dotnet/blob/master/Libraries/src/Amazon.Lambda.Core/ILambdaLogger.cs) no objeto de contexto, os métodos na [classe Console](https://docs.microsoft.com/en-us/dotnet/api/system.console) ou qualquer biblioteca de logs que grave no `stdout` ou no `stderr`.

O runtime do .NET registra em log as linhas `START`, `END` e `REPORT` para cada invocação. A linha do relatório fornece os detalhes a seguir.

**RELATAR campos de dados de linha**
+ **RequestId**: o ID de solicitação exclusivo para a invocação.
+ **Duração**: a quantidade de tempo que o método de manipulador da função gastou processando o evento.
+ **Duração faturada**: a quantia de tempo faturada para a invocação.
+ **Tamanho da memória**: a quantidade de memória alocada para a função.
+ **Memória máxima utilizada**: a quantidade de memória utilizada pela função. Quando as invocações compartilham um ambiente de execução, o Lambda relata a memória máxima usada em todas as invocações. Esse comportamento pode resultar em um valor relatado maior do que o esperado.
+ **Duração inicial**: para a primeira solicitação atendida, a quantidade de tempo que o runtime levou para carregar a função e executar o código fora do método do handler.
+ **XRAY TraceId**: para solicitações rastreadas, o [ID de rastreamento do AWS X-Ray](services-xray.md).
+ **SegmentId**: para solicitações rastreadas, o ID do segmento do X-Ray.
+ **Amostragem**: para solicitações rastreadas, o resultado da amostragem.

## Uso de controles avançados de registro em log do Lambda com .NET
<a name="csharp-logging-advanced"></a>

Para dar mais controle sobre como os logs das funções são capturados, processados e consumidos, você pode configurar as seguintes opções de log para runtimes compatíveis do .NET:
+ **Formato do log**: selecione entre texto simples e formato JSON estruturado para os logs da sua função.
+ **Nível de log**: para logs no formato JSON, escolha o nível de detalhe dos logs enviados pelo Lambda para o CloudWatch, como ERROR, DEBUG ou INFO.
+ **Grupo de logs**: escolha o grupo de logs do CloudWatch para o qual sua função envia logs.

Para obter mais informações sobre essas opções de registro em log e instruções sobre como configurar a função para usá-las, consulte [Configurar controles avançados de registro em log para funções do Lambda](monitoring-logs.md#monitoring-cloudwatchlogs-advanced).

Para usar as opções de formato de log e nível de log com as funções do Lambda para .NET, consulte as orientações nas seções a seguir.

### Uso de logs em formato JSON estruturado com .NET
<a name="csharp-logging-advanced-JSON"></a>

Se você selecionar JSON para o formato de log da função, o Lambda enviará a saída de logs usando [ILambdaLogger](https://github.com/aws/aws-lambda-dotnet/blob/master/Libraries/src/Amazon.Lambda.Core/ILambdaLogger.cs) como JSON estruturado. Cada objeto de log JSON contém pelo menos cinco pares de valores-chave com as seguintes chaves:
+ `"timestamp"`: o horário em que a mensagem de log foi gerada.
+ `"level"`: o nível de log atribuído à mensagem.
+ `"requestId"`: o ID de solicitação exclusivo para invocar a função.
+ `"traceId"`: a variável de ambiente `_X_AMZN_TRACE_ID`
+ `"message"`: o conteúdo da mensagem de log.

A instância `ILambdaLogger` pode adicionar mais pares de valores-chave, por exemplo, ao gerar logs de exceções. Também é possível fornecer seus próprios parâmetros adicionais, conforme descrito na seção [Parâmetros de log fornecidos pelo cliente](#csharp-logging-advanced-JSON-user-supplied).

**nota**  
Se o código já usa outra biblioteca de logs para produzir logs em formato JSON, confira se o formato de log da função está definido como texto sem formatação. Definir o formato de log como JSON resultará na codificação dupla das saídas de log.

O exemplo de comando de geração de log a seguir mostra como escrever uma mensagem de log com o nível `INFO`.

**Example Código de log do .NET**  

```
context.Logger.LogInformation("Fetching cart from database");
```

Também é possível usar um método de log genérico que usa o nível de log como argumento, conforme mostrado no exemplo a seguir.

```
context.Logger.Log(LogLevel.Information, "Fetching cart from database");
```

A saída de log desse exemplo de trechos de código seria capturada no CloudWatch Logs da seguinte forma:

**Example Registro em log JSON**  

```
{
    "timestamp": "2025-09-07T01:30:06.977Z",
    "level": "Information",
    "requestId": "8f711428-7e55-46f9-ae88-2a65d4f85fc5",
    "traceId": "1-6408af34-50f56f5b5677a7d763973804",
    "message": "Fetching cart from database"
}
```

**nota**  
Se você configurar o formato de log da sua função para usar texto sem formatação, em vez de JSON, o nível de log capturado na mensagem seguirá a convenção da Microsoft de usar um rótulo de quatro caracteres. Por exemplo, um nível de log de `Debug` é representado na mensagem como `dbug`.  
Quando você configura sua função para usar logs no formato JSON, o nível de log capturado no log usa o rótulo completo, conforme mostrado no exemplo de registro de log JSON.

Se você não atribuir um nível à saída de log, o Lambda atribuirá automaticamente o nível INFO a ele.

#### Exceções de log em JSON
<a name="csharp-logging-advanced-JSON-exceptions"></a>

Ao usar a geração estruturada de logs JSON com `ILambdaLogger`, você pode registrar exceções em seu código, conforme mostrado no exemplo a seguir.

**Example uso de logs de exceções**  

```
try
{
    connection.ExecuteQuery(query);
}
catch(Exception e)
{
    context.Logger.LogWarning(e, "Error executing query");
}
```

A saída do formato de log por esse código é mostrada no JSON de exemplo a seguir. Observe que a propriedade `message` no JSON é preenchida usando o argumento de mensagem fornecido na chamada `LogWarning`, enquanto a propriedade `errorMessage` vem da propriedade `Message` da própria exceção.

**Example Registro em log JSON**  

```
{
    "timestamp": "2025-09-07T01:30:06.977Z",
    "level": "Warning",
    "requestId": "8f711428-7e55-46f9-ae88-2a65d4f85fc5",
    "traceId": "1-6408af34-50f56f5b5677a7d763973804",
    "message": "Error executing query",
    "errorType": "System.Data.SqlClient.SqlException",
    "errorMessage": "Connection closed",
    "stackTrace": ["<call exception.StackTrace>"]
}
```

Se o formato de log da sua função estiver definido como JSON, o Lambda também mostrará mensagens de log formatadas em JSON quando seu código gerar uma exceção não detectada. O exemplo de trecho de código e mensagem de log a seguir mostra como as exceções não detectadas são registradas em log.

**Example código de exceção**  

```
throw new ApplicationException("Invalid data");
```

**Example Registro em log JSON**  

```
{
    "timestamp": "2025-09-07T01:30:06.977Z",
    "level": "Error",
    "requestId": "8f711428-7e55-46f9-ae88-2a65d4f85fc5",
    "traceId": "1-6408af34-50f56f5b5677a7d763973804",
    "message": "Invalid data",
    "errorType": "System.ApplicationException",
    "errorMessage": "Invalid data",
    "stackTrace": ["<call exception.StackTrace>"]
}
```

#### Parâmetros de log fornecidos pelo cliente
<a name="csharp-logging-advanced-JSON-user-supplied"></a>

Com mensagens de log formatadas em JSON, você pode fornecer parâmetros adicionais de log e incluí-los no log `message`. O exemplo de trecho de código a seguir mostra um comando para adicionar dois parâmetros fornecidos pelo usuário com os rótulos `retryAttempt` e `uri`. No exemplo, o valor desses parâmetros vem dos argumentos `retryAttempt` e `uriDestination` passados para o comando de geração e log.

**Example Comando de geração de log JSON com parâmetros adicionais**  

```
context.Logger.LogInformation("Starting retry {retryAttempt} to make GET request to {uri}", retryAttempt, uriDestination);
```

A saída da mensagem de log desse comando é mostrada no JSON de exemplo a seguir.

**Example Registro em log JSON**  

```
{
    "timestamp": "2025-09-07T01:30:06.977Z",
    "level": "Information",
    "requestId": "8f711428-7e55-46f9-ae88-2a65d4f85fc5",
    "traceId": "1-6408af34-50f56f5b5677a7d763973804",
    "message": "Starting retry 1 to make GET request to http://example.com/",
    "retryAttempt": 1,
    "uri": "http://example.com/"
}
```

**dica**  
Também é possível usar propriedades posicionais, em vez de nomes, ao especificar parâmetros adicionais. O comando de geração de log do exemplo anterior também poderia ser escrito da seguinte forma:  

```
context.Logger.LogInformation("Starting retry {0} to make GET request to {1}", retryAttempt, uriDestination);
```

Observe que, quando você fornece parâmetros adicionais de log, o Lambda os captura como propriedades de nível superior no registro de log JSON. Essa abordagem difere de algumas bibliotecas populares de logs .NET, como `Serilog`, que captura parâmetros adicionais em um objeto filho separado.

Se o argumento que você fornece para um parâmetro adicional for um objeto complexo, por padrão, o Lambda usa o método `ToString()` para fornecer o valor. Para indicar que um argumento deve ser um objeto serializado JSON, use o prefixo `@` conforme mostrado no trecho de código a seguir. Neste exemplo, `User` é um objeto com as propriedades `FirstName` e `LastName`.

**Example Comando de geração de log JSON com objeto serializado JSON**  

```
context.Logger.LogInformation("User {@user} logged in", User);
```

A saída da mensagem de log desse comando é mostrada no JSON de exemplo a seguir.

**Example Registro em log JSON**  

```
{
    "timestamp": "2025-09-07T01:30:06.977Z",
    "level": "Information",
    "requestId": "8f711428-7e55-46f9-ae88-2a65d4f85fc5",
    "traceId": "1-6408af34-50f56f5b5677a7d763973804",
    "message": "User {@user} logged in",
    "user": 
    {
        "FirstName": "John",
        "LastName": "Doe"
    }
}
```

Se o argumento para um parâmetro adicional for uma matriz ou implementar `IList` ou `IDictionary`, o Lambda acrescentará o argumento à mensagem de log JSON como uma matriz, conforme mostrado no exemplo de registro de log JSON a seguir. Neste exemplo, `{users}` usa um argumento `IList` que contém instâncias da propriedade `User` com o mesmo formato do exemplo anterior. O Lambda converte `IList` em uma matriz, com cada valor sendo criado usando o método `ToString`.

**Example Registro de log JSON com um argumento `IList`**  

```
{
    "timestamp": "2025-09-07T01:30:06.977Z",
    "level": "Information",
    "requestId": "8f711428-7e55-46f9-ae88-2a65d4f85fc5",
    "traceId": "1-6408af34-50f56f5b5677a7d763973804",
    "message": "{users} have joined the group",
    "users": 
    [
        "Rosalez, Alejandro",
        "Stiles, John"       
    ] 
}
```

Também é possível serializar a lista com JSON usando o prefixo `@` em seu comando de geração de log. No exemplo de registro de log JSON a seguir, a propriedade `users` é serializada em JSON.

**Example Registro de log JSON com um argumento `IList` serializado JSON**  

```
{
    "timestamp": "2025-09-07T01:30:06.977Z",
    "level": "Information",
    "requestId": "8f711428-7e55-46f9-ae88-2a65d4f85fc5",
    "traceId": "1-6408af34-50f56f5b5677a7d763973804",
    "message": "{@users} have joined the group",
    "users": 
    [
        {
            "FirstName": "Alejandro",
            "LastName": "Rosalez"
        },
        {
            "FirstName": "John",
            "LastName": "Stiles"
        }        
    ] 
}
```

### Uso de filtragem em nível de log com .NET
<a name="csharp-logging-advanced-levels"></a>

Ao configurar a filtragem em nível de log, você pode optar por enviar somente logs de um determinado nível de detalhe, ou inferior, para o CloudWatch Logs. Para saber como configurar a filtragem em nível de log para a função, consulte [Filtragem em nível de log](monitoring-cloudwatchlogs-log-level.md).

Para o AWS Lambda filtrar suas mensagens de log por nível de log, você pode usar logs formatados em JSON ou usar os métodos .NET `Console` para gerar mensagens de log. Para criar logs no formato JSON, [configure o tipo de log da sua função como JSON](monitoring-cloudwatchlogs-logformat.md#monitoring-cloudwatchlogs-set-format) e use a instância `ILambdaLogger`.

Com logs formatados em JSON, o Lambda filtrará as saídas de log usando o par de valores-chave “nível” no objeto JSON descrito em [Uso de logs em formato JSON estruturado com .NET](#csharp-logging-advanced-JSON).

Se você usa os métodos .NET `Console` para gravar mensagens no CloudWatch Logs, o Lambda aplica níveis de log às suas mensagens da seguinte forma:
+ **Método Console.WriteLine**: o Lambda aplica um nível de log `INFO`
+ **Método Console.Error**: o Lambda aplica um nível de log `ERROR`

Ao configurar sua função para usar a filtragem em nível de log, você precisa selecionar entre as seguintes opções para o nível de logs enviados pelo Lambda para o CloudWatch Logs. Observe o mapeamento dos níveis de log usados pelo Lambda com os níveis padrão da Microsoft usados pelo `ILambdaLogger` .NET.


| Nível de log do Lambda | Nível equivalente da Microsoft | Uso padrão | 
| --- | --- | --- | 
| TRACE (mais detalhes) | Rastreamento | As informações mais detalhadas usadas para rastrear o caminho da execução do código | 
| DEBUG | Depure | Informações detalhadas para depuração do sistema | 
| INFORMAÇÕES | Informações | Mensagens que registram a operação normal da função | 
| WARN | Aviso | Mensagens sobre possíveis erros que podem levar a um comportamento inesperado se não forem corrigidos | 
| ERRO | Erro | Mensagens sobre problemas que impedem que o código funcione conforme o esperado | 
| FATAL (menos detalhes) | Crítico | Mensagens sobre erros graves que fazem a aplicação parar de funcionar | 

O Lambda envia logs do nível de detalhe selecionado, e dos níveis inferiores, para o CloudWatch. Por exemplo, se você configurar um nível de log de WARN, o Lambda enviará logs correspondentes aos níveis WARN, ERROR e FATAL.

## Outras ferramentas de geração de log e bibliotecas
<a name="csharp-tools-libraries"></a>

O [Powertools para AWS Lambda (.NET)](https://docs.aws.amazon.com/powertools/dotnet/) é um kit de ferramentas para desenvolvedores para implementar práticas recomendadas de tecnologia sem servidor e aumentar a velocidade do desenvolvedor. O [utilitário de logs](https://docs.aws.amazon.com/powertools/dotnet/core/logging/) fornece um registrador de logs otimizado para Lambda que inclui informações adicionais sobre o contexto da função em todas as suas funções, com saída estruturada como JSON. Use esse utilitário para fazer o seguinte:
+ Capturar campos-chave do contexto do Lambda, inicialização a frio e estruturas registrando em log a saída como JSON
+ Registrar em log eventos de invocação do Lambda quando instruído (desativado por padrão)
+ Imprimir todos os logs somente para uma porcentagem das invocações por meio da amostragem de logs (desativado por padrão)
+ Anexar chaves adicionais ao log estruturado a qualquer momento
+ Use um formatador de log personalizado (Bring Your Own Formatter) para gerar logs em uma estrutura compatível com o RFC de logs da sua organização

## Uso do Powertools para AWS Lambda (.NET) e do AWS SAM para registro em log estruturado
<a name="dotnet-logging-sam"></a>

Siga as etapas abaixo para baixar, criar e implantar um exemplo de aplicação C\$1 Hello World com os módulos integrados do [Powertools para AWS Lambda (.NET)](https://docs.powertools.aws.dev/lambda-dotnet) usando o AWS SAM. Esta aplicação implementa um backend de API básico e usa o Powertools para emitir logs, métricas e rastreamentos. Consiste em um endpoint do Amazon API Gateway e uma função do Lambda. Quando você envia uma solicitação GET ao endpoint do API Gateway, a função do Lambda invoca, envia logs e métricas usando o formato de métricas incorporadas ao CloudWatch e envia rastreamentos ao AWS X-Ray. A função retorna uma mensagem `hello world`.

**Pré-requisitos**

Para executar as etapas desta seção, você deve ter o seguinte:
+ .NET 8
+ [AWS CLI versão 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS SAM CLI versão 1.75 ou posterior](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). Se você tiver uma versão mais antiga da CLI do AWS SAM, consulte [Atualizando a CLI do AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade).

**Implantar uma aplicação de exemplo do AWS SAM**

1. Inicialize a aplicação usando o modelo Hello World TypeScript.

   ```
   sam init --app-template hello-world-powertools-dotnet --name sam-app --package-type Zip --runtime dotnet6 --no-tracing
   ```

1. Crie a aplicação.

   ```
   cd sam-app && sam build
   ```

1. Implante o aplicativo.

   ```
   sam deploy --guided
   ```

1. Siga as instruções na tela. Para aceitar as opções padrão fornecidas na experiência interativa, pressione `Enter`.
**nota**  
Em **HelloWorldFunction pode não ter autorização definida, tudo bem?**, certifique-se de inserir `y`.

1. Obtenha o URL da aplicação implantada:

   ```
   aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
   ```

1. Invoque o endpoint da API:

   ```
   curl -X GET <URL_FROM_PREVIOUS_STEP>
   ```

   Se tiver êxito, você verá esta resposta:

   ```
   {"message":"hello world"}
   ```

1. Para obter os logs da função, execute [sam logs](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-logs.html). Para obter mais informações, consulte [Trabalhar com logs](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-logging.html) no *Guia do desenvolvedor do AWS Serverless Application Model*.

   ```
   sam logs --stack-name sam-app
   ```

   O resultado de saída do log se parece com:

   ```
   2025/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2025-09-20T14:15:27.988000 INIT_START Runtime Version: dotnet:6.v13        Runtime Version ARN: arn:aws:lambda:ap-southeast-2::runtime:699f346a05dae24c58c45790bc4089f252bf17dae3997e79b17d939a288aa1ec
   2025/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2025-09-20T14:15:28.229000 START RequestId: bed25b38-d012-42e7-ba28-f272535fb80e Version: $LATEST
   2025/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2025-09-20T14:15:29.259000 2025-09-20T14:15:29.201Z        bed25b38-d012-42e7-ba28-f272535fb80e    info   {"_aws":{"Timestamp":1676902528962,"CloudWatchMetrics":[{"Namespace":"sam-app-logging","Metrics":[{"Name":"ColdStart","Unit":"Count"}],"Dimensions":[["FunctionName"],["Service"]]}]},"FunctionName":"sam-app-HelloWorldFunction-haKIoVeose2p","Service":"PowertoolsHelloWorld","ColdStart":1}
   2025/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2025-09-20T14:15:30.479000 2025-09-20T14:15:30.479Z        bed25b38-d012-42e7-ba28-f272535fb80e    info   {"ColdStart":true,"XrayTraceId":"1-63f3807f-5dbcb9910c96f50742707542","CorrelationId":"d3d4de7f-4ccc-411a-a549-4d67b2fdc015","FunctionName":"sam-app-HelloWorldFunction-haKIoVeose2p","FunctionVersion":"$LATEST","FunctionMemorySize":256,"FunctionArn":"arn:aws:lambda:ap-southeast-2:123456789012:function:sam-app-HelloWorldFunction-haKIoVeose2p","FunctionRequestId":"bed25b38-d012-42e7-ba28-f272535fb80e","Timestamp":"2025-09-20T14:15:30.4602970Z","Level":"Information","Service":"PowertoolsHelloWorld","Name":"AWS.Lambda.Powertools.Logging.Logger","Message":"Hello world API - HTTP 200"}
   2025/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2025-09-20T14:15:30.599000 2025-09-20T14:15:30.599Z        bed25b38-d012-42e7-ba28-f272535fb80e    info   {"_aws":{"Timestamp":1676902528922,"CloudWatchMetrics":[{"Namespace":"sam-app-logging","Metrics":[{"Name":"ApiRequestCount","Unit":"Count"}],"Dimensions":[["Service"]]}]},"Service":"PowertoolsHelloWorld","ApiRequestCount":1}
   2025/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2025-09-20T14:15:30.680000 END RequestId: bed25b38-d012-42e7-ba28-f272535fb80e
   2025/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2025-09-20T14:15:30.680000 REPORT RequestId: bed25b38-d012-42e7-ba28-f272535fb80e  Duration: 2450.99 ms   Billed Duration: 2692 ms Memory Size: 256 MB     Max Memory Used: 74 MB  Init Duration: 240.05 ms
   XRAY TraceId: 1-63f3807f-5dbcb9910c96f50742707542       SegmentId: 16b362cd5f52cba0
   ```

1. Este é um endpoint de API pública que é acessado pela Internet. Recomendamos excluir o endpoint após o teste.

   ```
   sam delete
   ```

### Gerenciar a retenção de logs
<a name="csharp-log-retention"></a>

Os grupos de logs não são excluídos automaticamente excluídos quando você exclui uma função. Para evitar armazenar logs por tempo indeterminado, exclua o grupo de logs ou configure um período de retenção após o qual o CloudWatch excluirá os logs automaticamente. Para configurar a retenção de logs, adicione o seguinte ao seu modelo do AWS SAM:

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      # Omitting other properties

  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}"
      RetentionInDays: 7
```

## Visualizar logs no console do Lambda
<a name="csharp-logging-console"></a>

É possível usar o console do Lambda para exibir a saída do log depois de invocar uma função do Lambda.

Se seu código puder ser testado no editor de **Código** incorporado, você encontrará logs nos **resultados de execução**. Ao usar o recurso de teste do console para invocar uma função, você encontrará **Saída de log** na seção **Detalhes**.

## Visualização de logs no console do CloudWatch
<a name="csharp-logging-cwconsole"></a>

É possível usar o console do Amazon CloudWatch para exibir logs de todas as invocações da função do Lambda.

**Para visualizar logs no console do CloudWatch**

1. No console do Amazon CloudWatch, abra a [página Log groups](https://console.aws.amazon.com/cloudwatch/home?#logs:) (Grupos de log).

1. Escolha o grupo de logs de sua função (**/aws/lambda/*nome-de-sua-função***).

1. Escolha um stream de logs.

Cada fluxo de log corresponde a uma [instância da sua função](lambda-runtime-environment.md). Um fluxo de logs é exibido quando você atualiza sua função do Lambda e quando mais instâncias são criadas para lidar com invocações simultâneas. Para localizar logs de uma invocação específica, recomendamos intrumentar sua função com AWS X-Ray. O X-Ray registra detalhes sobre a solicitação e o stream de logs no rastreamento.

## Visualizar logs usando a AWS Command Line Interface (AWS CLI)
<a name="csharp-logging-cli"></a>

O AWS CLI é uma ferramenta de código aberto que permite interagir com os serviços do AWS usando comandos no shell da linha de comando. Para concluir as etapas desta seção, você deve ter a [versão 2 da AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

É possível usar a [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) para recuperar logs de uma invocação usando a opção de comando `--log-type`. A resposta contém um campo `LogResult` com até 4 KB de logs codificados em base64 obtidos da invocação.

**Example recuperar um ID de log**  
O exemplo a seguir mostra como recuperar um *ID de log* do campo `LogResult` para uma função chamada `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
A seguinte saída deverá ser mostrada:  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example decodificar os logs**  
No mesmo prompt de comando, use o utilitário `base64` para decodificar os logs. O exemplo a seguir mostra como recuperar logs codificados em base64 de `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
A opção **cli-binary-format** será necessária se você estiver usando a AWS CLI versão 2. Para que essa seja a configuração padrão, execute `aws configure set cli-binary-format raw-in-base64-out`. Para obter mais informações, consulte [A AWS CLI comporta opções de linha de comando globais](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) no *Guia do usuário da AWS Command Line Interface versão 2*.  
A seguinte saída deverá ser mostrada:  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
O utilitário `base64` está disponível no Linux, macOS e [Ubuntu no Windows](https://docs.microsoft.com/en-us/windows/wsl/install-win10). Os usuários do macOS precisam usar `base64 -D`.

**Example get-logs.sh script**  
No mesmo prompt de comando, use o script a seguir para fazer download dos últimos cinco eventos de log. O script usa `sed` para remover as aspas do arquivo de saída e fica inativo por 15 segundos para que os logs tenham tempo de ficar disponíveis. A saída inclui a resposta do Lambda, e a saída do comando `get-log-events`.   
Copie o conteúdo do exemplo de código a seguir e salve no diretório de seu projeto do Lambda como `get-logs.sh`.  
A opção **cli-binary-format** será necessária se você estiver usando a AWS CLI versão 2. Para que essa seja a configuração padrão, execute `aws configure set cli-binary-format raw-in-base64-out`. Para obter mais informações, consulte [A AWS CLI comporta opções de linha de comando globais](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) no *Guia do usuário da AWS Command Line Interface versão 2*.  

```
#!/bin/bash
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out
sed -i'' -e 's/"//g' out
sleep 15
aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name stream1 --limit 5
```

**Example macOS e Linux (somente)**  
No mesmo prompt de comando, os usuários do macOS e do Linux podem precisar executar o comando a seguir para garantir que o script seja executável.  

```
chmod -R 755 get-logs.sh
```

**Example recuperar os últimos cinco eventos de log**  
No mesmo prompt de comando, execute o script a seguir para obter os últimos cinco eventos de log.  

```
./get-logs.sh
```
A seguinte saída deverá ser mostrada:  

```
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{
    "events": [
        {
            "timestamp": 1559763003171,
            "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n",
            "ingestionTime": 1559763003309
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r  \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r  \"key\": \"value\"\r}\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n",
            "ingestionTime": 1559763018353
        }
    ],
    "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795",
    "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080"
}
```

## Excluir logs
<a name="csharp-logging-delete"></a>

Os grupos de logs não são excluídos automaticamente excluídos quando você exclui uma função. Para evitar armazenar logs indefinidamente, exclua o grupo de logs ou[Configurar um período de retenção](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#SettingLogRetention)após o qual os logs são excluídos automaticamente.