Configurar controles avançados de registro em log para funções do Lambda
Para dar mais controle sobre como os logs das funções são capturados, processados e consumidos, o Lambda oferece as seguintes opções de configuração de log:
-
Formato do log: selecione entre texto simples e formato JSON estruturado para os logs da sua função.
-
Nível de log: para logs JSON estruturados, 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 saber mais sobre a configuração de controles avançados de registro em log, consulte as seguintes seções:
Tópicos
Configurar logs em formato de texto simples e JSON
Capturar as saídas de log como pares de valores-chave JSON facilita a pesquisa e a filtragem ao depurar suas funções. Com os logs em formato JSON, você também pode adicionar tags e informações contextuais aos logs. Esse recurso ajuda a realizar análises automatizadas de grandes volumes de dados de log. A menos que o fluxo de trabalho de desenvolvimento dependa de ferramentas existentes que consumam logs do Lambda em texto simples, recomendamos que você selecione JSON para o formato de log.
Para todos os runtimes gerenciados pelo Lambda, você pode escolher se os logs do sistema da função são enviados para o CloudWatch Logs em texto simples não estruturado ou no formato JSON. Os logs do sistema são os logs que o Lambda gera e, às vezes, são conhecidos como logs de eventos da plataforma.
Para runtimes compatíveis, quando você usa um dos métodos de registro em log integrado compatível, o Lambda também pode gerar os logs de aplicações da função (os logs gerados pelo código da função) no formato JSON estruturado. Quando você configura o formato de log da função para esses runtimes, a configuração escolhida se aplica aos logs do sistema e de aplicações.
Para runtimes compatíveis, se a função usar uma biblioteca ou um método de registro em log compatível, você não precisa fazer nenhuma alteração no código existente para que o Lambda capture registros em JSON estruturado.
nota
O uso de log no formato JSON adiciona metadados e codifica mensagens de log como objetos JSON contendo uma série de pares de valores-chave. Por causa disso, o tamanho das mensagens de log da função pode aumentar.
Runtimes e métodos de registro em log compatíveis
Atualmente, o Lambda é compatível com a opção de gerar logs de aplicações em JSON estruturado para os runtimes a seguir.
Runtime | Versões compatíveis |
---|---|
Java | Todos os runtimes do Java, exceto Java 8 no Amazon Linux 1 |
.NET | .NET 6 e .NET 8 |
Node.js | Node.js 16 e posterior |
Python | Python 3.8 e posterior |
Para que o Lambda envie os logs de aplicações da função para o CloudWatch no formato JSON estruturado, sua função precisa usar as seguintes ferramentas de registro em log integradas para gerar logs:
-
Java: o logger
LambdaLogger
ou Log4j2. -
.NET: a instância
ILambdaLogger
no objeto de contexto. -
Node.js: os métodos do console
console.trace
,console.debug
,console.log
,console.info
,console.error
econsole.warn
. -
Python: a biblioteca
logging
padrão do Python
Para obter mais informações sobre o uso de controles avançados de registro em log com runtimes compatíveis, consulte Registrar em log e monitorar funções do Lambda em Java, Registrar em log e monitorar funções do Lambda em Node.js e Registrar em log e monitorar funções do Lambda em Python.
Para outros runtimes gerenciados do Lambda, ele atualmente só tem compatibilidade nativa com a captura de logs do sistema no formato JSON estruturado. No entanto, você ainda pode capturar logs de aplicações no formato JSON estruturado em qualquer runtime usando ferramentas de registro em log, como o Powertools para AWS Lambda, que gera logs no formato JSON.
Formatos de log padrão
Atualmente, o formato de log padrão para todos os runtimes do Lambda é texto simples.
Se você já usa bibliotecas de registro em log, como o Powertools para AWS Lambda, para gerar logs de funções no formato JSON estruturado, não precisará alterar o código se selecionar log no formato JSON. O Lambda não codifica duas vezes nenhum log que já esteja codificado em JSON. Então, os logs de aplicações da função continuarão sendo capturados como antes.
Formato JSON para logs do sistema
Quando você configura o formato de log da função como JSON, cada item de log do sistema (evento de plataforma) é capturado como um objeto JSON que contém pares de valores-chave com as seguintes chaves:
-
"time"
: o horário em que a mensagem de log foi gerada. -
"type"
: o tipo de evento que está sendo registrado em log -
"record"
: o conteúdo do log gerado
O formato do valor "record"
varia de acordo com o tipo de evento que está sendo registrado em log. Para ter mais informações, consulte Tipos de objeto Event da API de telemetria. Para obter mais informações sobre os níveis de log atribuídos aos eventos de log do sistema, consulte Mapeamento de eventos no nível de log do sistema.
Para comparação, os dois exemplos a seguir mostram a mesma saída de log nos formatos de texto simples e JSON estruturado. Observe que, na maioria dos casos, os eventos de log do sistema contêm mais informações quando enviados no formato JSON do que quando enviados em texto simples.
exemplo texto simples:
2024-03-13 18:56:24.046000 fbe8c1 INIT_START Runtime Version: python:3.12.v18 Runtime Version ARN: arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0
exemplo JSON estruturado:
{
"time": "2024-03-13T18:56:24.046Z",
"type": "platform.initStart",
"record": {
"initializationType": "on-demand",
"phase": "init",
"runtimeVersion": "python:3.12.v18",
"runtimeVersionArn": "arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0"
}
}
nota
Acessar dados de telemetria em tempo real para extensões usando a API Telemetria sempre emite eventos de plataforma, como START
e REPORT
no formato JSON. Configurar o formato dos logs do sistema enviados pelo Lambda para o CloudWatch não afeta o comportamento da API de Telemetria do Lambda.
Formato JSON para logs de aplicações
Quando você configura o formato de log da função como JSON, as saídas de logs de aplicações gravadas usando bibliotecas e métodos de registro em log compatíveis são capturadas como um objeto JSON que contém pares de valores de chave com as chaves a seguir.
-
"timestamp"
: o horário em que a mensagem de log foi gerada. -
"level"
: o nível de log atribuído à mensagem. -
"message"
: o conteúdo da mensagem de log. -
"requestId"
(Python, .NET e Node.js) ou"AWSrequestId"
(Java): o ID de solicitação exclusivo para a invocação da função
Dependendo do runtime e do método de registro em log que a função usa, esse objeto JSON também pode conter pares de chaves adicionais. Por exemplo, em Node.js, se a função usa métodos do console
para registrar em log objetos de erro usando vários argumentos, o objeto JSON conterá pares adicionais de valores de chave com as chaves errorMessage
, errorType
e stackTrace
. Para saber mais sobre logs formatados em JSON em diferentes runtimes do Lambda, consulte Registrar em log e monitorar funções do Lambda em Python, Registrar em log e monitorar funções do Lambda em Node.js e Registrar em log e monitorar funções do Lambda em Java.
nota
A chave usada pelo Lambda para o valor do carimbo de data/hora é diferente para logs do sistema e de aplicações. Para logs do sistema, o Lambda usa a chave "time"
para manter a consistência com a API de telemetria. Para logs de aplicações, o Lambda segue as convenções dos runtimes compatíveis e usa "timestamp"
.
Para comparação, os dois exemplos a seguir mostram a mesma saída de log nos formatos de texto simples e JSON estruturado.
exemplo texto simples:
2024-10-27T19:17:45.586Z 79b4f56e-95b1-4643-9700-2807f4e68189 INFO some log message
exemplo JSON estruturado:
{
"timestamp":"2024-10-27T19:17:45.586Z",
"level":"INFO",
"message":"some log message",
"requestId":"79b4f56e-95b1-4643-9700-2807f4e68189"
}
Configurar o formato de log da função
Para configurar o formato de log da função, você pode usar o console do Lambda ou a AWS Command Line Interface (AWS CLI). Você também pode configurar o formato de log de uma função usando os comandos CreateFunction e UpdateFunctionConfiguration da API do Lambda, o recurso AWS::Serverless::Function do AWS Serverless Application Model (AWS SAM) e o recurso AWS::Lambda::Function do AWS CloudFormation.
Alterar o formato de log da função não afeta os logs existentes armazenados no CloudWatch Logs. Somente os novos logs usarão o formato atualizado.
Se você alterar o formato de log da função para JSON e não definir o nível do log, o Lambda definirá automaticamente o nível do log da aplicação e do sistema da função como INFO. Isso significa que o Lambda só envia saídas de log de nível WARN e inferiores para o CloudWatch Logs. Para saber mais sobre a filtragem em nível de log da aplicação e do sistema, consulte Filtragem em nível de log
nota
Em runtimes do Python, quando o formato de log da função é definido como texto sem formatação, a configuração padrão de nível de log é WARN. Isso significa que o Lambda só envia saídas de log de nível WARN e inferior para o CloudWatch Logs. Alterar o formato de log da função para JSON altera esse comportamento padrão. Para saber mais sobre registro em log no Python, consulte Registrar em log e monitorar funções do Lambda em Python.
Para funções do Node.js que emitem logs de formato de métricas incorporadas (EMF), alterar o formato de log da função para JSON pode fazer com que o CloudWatch não consiga reconhecer as métricas.
Importante
Se a função usa o Powertools para AWS Lambda (TypeScript) ou bibliotecas cliente EMF de código aberto para emitir logs em EMF, atualize as bibliotecas do Powertools
Configurar o formato em log da função (console)
Abra a página Funções
do console do Lambda. -
Escolha uma função.
-
Na página de configuração da função, escolha Ferramentas de monitoramento e operações.
-
No painel Configuração de registro em log, escolha Editar.
-
Em Conteúdo do log, em Formato do log, selecione Texto ou JSON.
-
Escolha Salvar.
Alterar o formato de log de uma função existente (AWS CLI)
-
Para alterar o formato de log de uma função existente, use o comando update-function-configuration
. Defina a opção LogFormat
emLoggingConfig
comoJSON
ouText
.aws lambda update-function-configuration \ --function-name myFunction \ --logging-config LogFormat=JSON
Definir o formato do log ao criar uma função (AWS CLI)
-
Para configurar o formato do log ao criar uma nova função, use a opção
--logging-config
no comando create-function. Defina LogFormat
comoJSON
ouText
. O exemplo de comando a seguir cria uma função Node.js que gera logs em JSON estruturado.Se você não especificar um formato de log ao criar uma função, o Lambda usará o formato de log padrão para a versão de runtime selecionada. Para obter informações sobre o formato do log, consulte Formatos de log padrão.
aws lambda create-function \ --function-name myFunction \ --runtime nodejs22.x \ --handler index.handler \ --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole \ --logging-config LogFormat=JSON
Filtragem em nível de log
O Lambda pode filtrar os logs da função para que somente logs de um determinado nível de detalhes, ou de um nível inferior, sejam enviados para o CloudWatch Logs. Você pode configurar a filtragem em nível de logs separadamente para os logs do sistema da função (logs gerados pelo Lambda) e os logs de aplicações (logs gerados pelo código da função).
Para Runtimes e métodos de registro em log compatíveis, você não precisa fazer nenhuma alteração no código da função do Lambda para filtrar logs de aplicações da função.
Para todos os outros runtimes e métodos de registro em log, o código da função deve gerar eventos de log para stdout
ou stderr
como objetos formatados em JSON que contenham um par de valores-chave com a chave "level"
. Por exemplo, o Lambda interpreta a saída a seguir stdout
como um log de nível DEBUG.
print('{"level": "debug", "msg": "my debug log", "timestamp": "2024-11-02T16:51:31.587199Z"}')
Se o campo de valor "level"
for inválido ou estiver ausente, o Lambda atribuirá à saída do log o nível INFO. Para que o Lambda use o campo de carimbo de data/hora, você precisa especificar a hora em um formato RFC 3339
Ao denominar a chave de carimbo de data/hora, siga as convenções do runtime que estiver usando. O Lambda é compatível com as convenções de nomenclatura mais comuns usadas pelos runtimes gerenciados.
nota
Para usar a filtragem em nível de log, sua função precisar estar configurada para usar logs em formato JSON. O formato de log padrão para todos os runtimes gerenciados pelo Lambda atualmente é texto simples. Para saber como configurar logs em formato JSON para a função, consulte Configurar o formato de log da função.
Para logs de aplicações (logs gerados pelo código da função), você pode escolher entre os níveis de log a seguir.
Nível de log | Uso padrão |
---|---|
TRACE (mais detalhes) | As informações mais detalhadas usadas para rastrear o caminho da execução do código |
DEBUG | Informações detalhadas para depuração do sistema |
INFO | Mensagens que registram a operação normal da função |
WARN | Mensagens sobre possíveis erros que podem levar a um comportamento inesperado se não forem corrigidos |
ERRO | Mensagens sobre problemas que impedem que o código funcione conforme o esperado |
FATAL (menos detalhes) | Mensagens sobre erros graves que fazem a aplicação parar de funcionar |
Quando você seleciona um nível de log, o Lambda envia logs desse nível, e de níveis inferiores, para o CloudWatch Logs. Por exemplo, se você definir o nível de log de aplicações de uma função como WARN, o Lambda não enviará saídas de log nos níveis INFO e DEBUG. O nível padrão de logs de aplicações para a filtragem de logs é INFO.
Quando o Lambda filtra os logs de aplicações da função, as mensagens de log sem nível receberão o nível INFO.
Para logs do sistema (logs gerados pelo serviço Lambda), você pode escolher entre os níveis de log a seguir.
Nível de log | Uso |
---|---|
DEBUG (mais detalhes) | Informações detalhadas para depuração do sistema |
INFO | Mensagens que registram a operação normal da função |
WARN (menos detalhes) | Mensagens sobre possíveis erros que podem levar a um comportamento inesperado se não forem corrigidos |
Quando você seleciona um nível de log, o Lambda envia logs desse nível, e de níveis inferiores. Por exemplo, se você definir o nível de log do sistema de uma função como INFO, o Lambda não enviará saídas de log no nível DEBUG.
Por padrão, o Lambda define o nível de log do sistema como INFO. Com essa configuração, o Lambda envia automaticamente as mensagens de log "start"
e "report"
para o CloudWatch. Para receber logs do sistema mais ou menos detalhados, altere o nível de log para DEBUG ou WARN. Para ver uma lista dos níveis de log para os quais o Lambda mapeia diferentes eventos de log do sistema, consulte Mapeamento de eventos no nível de log do sistema.
Configurar a filtragem em nível de log
Para configurar a filtragem em nível de log de aplicações e do sistema para a função, você pode usar o console do Lambda ou a AWS Command Line Interface (AWS CLI). Você também pode configurar o nível de log de uma função usando os comandos CreateFunction e UpdateFunctionConfiguration da API do Lambda, o recurso AWS::Serverless::Function do AWS Serverless Application Model (AWS SAM) e o recurso AWS::Lambda::Function do AWS CloudFormation.
Observe que, se você definir o nível de log da função no código, essa definição terá precedência sobre qualquer outra configuração de nível de log que você definir. Por exemplo, se você usar o método logging
setLevel()
do Python para definir o nível de registro em log da sua função como INFO, essa definição terá precedência sobre uma configuração de WARN que você definir usando o console do Lambda.
Configurar o nível de log de aplicações ou do sistema de uma função existente (console)
Abra a página Funções
do console do Lambda. -
Escolha uma função.
-
Na página de configuração da função, escolha Ferramentas de monitoramento e operações.
-
No painel Configuração de registro em log, escolha Editar.
-
Em Conteúdo do log, em Formato do log, certifique-se de que a opção JSON esteja selecionada.
-
Use os botões de opção para selecionar o Nível de log da aplicação e o Nível de log do sistema desejados para a função.
-
Escolha Salvar.
Configurar o nível de logs de aplicações ou do sistema de uma função existente (AWS CLI)
-
Para alterar o nível de logs de aplicações ou do sistema de uma função existente, use o comando update-function-configuration
. Use --logging-config
para definirSystemLogLevel
como um destes:DEBUG
,INFO
ouWARN
. DefinaApplicationLogLevel
comoDEBUG
,INFO
,WARN
,ERROR
ouFATAL
.aws lambda update-function-configuration \ --function-name myFunction \ --logging-config LogFormat=JSON,ApplicationLogLevel=ERROR,SystemLogLevel=WARN
Configurar a filtragem em nível de log ao criar uma função
-
Para configurar a filtragem em nível de log ao criar uma função, use
--logging-config
para definir as chavesSystemLogLevel
eApplicationLogLevel
no comando create-function. Defina SystemLogLevel
comoDEBUG
,INFO
ouWARN
. DefinaApplicationLogLevel
comoDEBUG
,INFO
,WARN
,ERROR
ouFATAL
.aws lambda create-function \ --function-name myFunction \ --runtime nodejs22.x \ --handler index.handler \ --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole \ --logging-config LogFormat=JSON,ApplicationLogLevel=ERROR,SystemLogLevel=WARN
Mapeamento de eventos no nível de log do sistema
Para eventos de log no nível do sistema gerados pelo Lambda, a tabela a seguir define o nível de log atribuído a cada evento. Para saber mais sobre os eventos listados na tabela, consulte Referência de esquema para Event da API de Telemetria do Lambda.
Nome do evento | Condição | Nível de log atribuído |
---|---|---|
initStart | runtimeVersion está definida | INFO |
initStart | runtimeVersion não está definida | DEBUG |
initRuntimeDone | status=success | DEBUG |
initRuntimeDone | status!=success | WARN |
initReport | initializationType=snapstart | INFO |
initReport | initializationType!=snapstart | DEBUG |
initReport | status!=success | WARN |
restoreStart | runtimeVersion está definida | INFO |
restoreStart | runtimeVersion não está definida | DEBUG |
restoreRuntimeDone | status=success | DEBUG |
restoreRuntimeDone | status!=success | WARN |
restoreReport | status=success | INFO |
restoreReport | status!=success | WARN |
rápido | - | INFO |
runtimeDone | status=success | DEBUG |
runtimeDone | status!=success | WARN |
relatório | status=success | INFO |
relatório | status!=success | WARN |
extensão | state=success | INFO |
extensão | state!=success | WARN |
logSubscription | - | INFO |
telemetrySubscription | - | INFO |
logsDropped | - | WARN |
nota
Acessar dados de telemetria em tempo real para extensões usando a API Telemetria sempre emite o conjunto completo de eventos da plataforma. Configurar o nível dos logs do sistema enviados pelo Lambda para o CloudWatch não afeta o comportamento da API de Telemetria do Lambda.
Filtragem em nível de log de aplicações com runtimes personalizados
Quando você configura a filtragem em nível de log de aplicações para a função, o Lambda define o nível de log de aplicações em segundo plano no runtime usando a variável de ambiente AWS_LAMBDA_LOG_LEVEL
. O Lambda também define o formato de log da função usando a variável de ambiente AWS_LAMBDA_LOG_FORMAT
. Você pode usar essas variáveis para integrar os controles avançados de registro em log do Lambda em um runtime personalizado.
Para definir as configurações de registro em log de uma função usando um runtime personalizado com o console, a AWS CLI e as APIs do Lambda, configure o runtime personalizado para verificar o valor dessas variáveis de ambiente. Depois disso, você pode configurar os loggers do runtime de acordo com o formato e os níveis de log selecionados.
Configurar grupos de logs do CloudWatch
Por padrão, o CloudWatch cria automaticamente um grupo de logs denominado /aws/lambda/<function name>
para a função quando ela é invocada pela primeira vez. Para configurar a função para enviar logs a um grupo de logs existente ou para criar um novo grupo de logs para a função, você pode usar a AWS CLI ou o console do Lambda. Você também pode configurar grupos de logs personalizados usando os comandos CreateFunction e UpdateFunctionConfiguration da API do Lambda e o recurso do AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function.
Você pode configurar várias funções do Lambda para enviar logs ao mesmo grupo de logs do CloudWatch. Por exemplo, é possível usar um único grupo de logs para armazenar os logs de todas as funções do Lambda que fizerem parte de uma aplicação específica. Quando você usa um grupo de logs personalizado para uma função do Lambda, os fluxos de log criados pelo Lambda incluem o nome e a versão da função. Isso garante que o mapeamento entre mensagens de log e funções seja preservado, mesmo se você usar o mesmo grupo de logs para várias funções.
O formato de nomenclatura de fluxos de logs para grupos de logs personalizados segue esta convenção:
YYYY/MM/DD/<function_name>[<function_version>][<execution_environment_GUID>]
Observe que, ao configurar um grupo de logs personalizado, o nome selecionado para o grupo de logs deve seguir as regras de nomenclatura do CloudWatch Logs. Além disso, nomes de grupos de logs personalizados não devem começar com a string aws/
. Se você criar um grupo de logs personalizado começando com aws/
, o Lambda não conseguirá criar o grupo de logs. Como resultado, os logs da função não serão enviados para o CloudWatch.
Alterar o grupo de logs de uma função (console)
-
Abra a página Funções
do console do Lambda. -
Escolha uma função.
-
Na página de configuração da função, escolha Ferramentas de monitoramento e operações.
-
No painel Configuração de registro em log, escolha Editar.
-
No painel Grupo de logs do grupo de logs do CloudWatch, escolha Personalizado.
-
Em Grupo de logs personalizado, insira o nome do grupo de logs do CloudWatch para o qual você deseja que sua função envie logs. Se você inserir o nome de um grupo de logs existente, sua função usará esse grupo. Se não existir nenhum grupo de logs com o nome inserido, o Lambda criará um novo grupo de logs para a função com esse nome.
Alterar o grupo de logs de uma função (AWS CLI)
-
Para alterar o grupo de logs de uma função existente, use o comando update-function-configuration
. aws lambda update-function-configuration \ --function-name myFunction \ --logging-config LogGroup=myLogGroup
Especificar um grupo de logs personalizado ao criar uma função (AWS CLI)
-
Para especificar um grupo de logs personalizado ao criar uma nova função do Lambda usando a AWS CLI, use a opção
--logging-config
. O comando de exemplo a seguir cria uma função do Lambda para Node.js que envia logs para um grupo de logs denominadomyLogGroup
.aws lambda create-function \ --function-name myFunction \ --runtime nodejs22.x \ --handler index.handler \ --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole \ --logging-config LogGroup=myLogGroup
Permissões da função de execução
Para que sua função envie logs para o CloudWatch Logs, ela precisa ter a permissão logs:PutLogEvents. Quando você configura o grupo de logs da função usando o console do Lambda, se a função não tiver essa permissão, o Lambda a adiciona por padrão ao perfil de execução da função. Quando o Lambda adiciona essa permissão, ele dá à função permissão para enviar logs para qualquer grupo de logs do CloudWatch Logs.
Para evitar que o Lambda atualize automaticamente o perfil de execução da função e o edite manualmente, expanda Permissões e desmarque Adicionar permissões necessárias.
Quando você configura o grupo de logs da função usando a AWS CLI, o Lambda não adiciona automaticamente a permissão logs:PutLogEvents
. Adicione a permissão ao perfil de execução da função, caso isso ainda não tenha sido feito. Essa permissão está incluída na política gerenciada AWSLambdaBasicExecutionRole