nota
O cliente runtime do Rust
O AWS Lambda monitora automaticamente as funções do Lambda em seu nome e envia 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 do runtime do Lambda envia detalhes sobre cada invocação à transmissão de logs e transmite os logs e outras saídas do código de sua função. Para ter mais informações, consulte Uso do CloudWatch Logs com o Lambda. Esta página descreve como produzir a saída de logs usando o código de sua função do Lambda.
Criação de uma função que grava logs
Para gerar os logs do código da sua função, é possível usar qualquer função de log que grave em o stdout
ou stderr
, como a macro println!
. O exemplo a seguir usa println!
para imprimir uma mensagem quando o manipulador da função é iniciado e antes de ele terminar.
use lambda_runtime::{service_fn, LambdaEvent, Error};
use serde_json::{json, Value};
async fn handler(event: LambdaEvent<Value>) -> Result<Value, Error> {
println!("Rust function invoked");
let payload = event.payload;
let first_name = payload["firstName"].as_str().unwrap_or("world");
println!("Rust function responds to {}", &first_name);
Ok(json!({ "message": format!("Hello, {first_name}!") }))
}
#[tokio::main]
async fn main() -> Result<(), Error> {
lambda_runtime::run(service_fn(handler)).await
}
Implementar registro em log avançado com a caixa Tracing
O Tracingsubscriber
antes de implementar o manipulador de funções. Em seguida, é possível usar macros de rastreamento como debug
, info
e error
para especificar o nível de log desejado para cada cenário.
exemplo — Uso da caixa Tracing
Observe o seguinte:
-
tracing_subscriber::fmt().json()
: quando esta opção é incluída, os registros são formatados em JSON. Para usar esta opção, é necessário incluir o recursojson
na dependênciatracing-subscriber
(por exemplo,tracing-subscriber = { version = "0.3.11", features = ["json"] }
). -
#[tracing::instrument(skip(event), fields(req_id = %event.context.request_id))]
: esta anotação gera um intervalo toda vez que o manipulador é invocado. O intervalo adiciona o ID da solicitação a cada linha do log. -
{ %first_name }
: esta estrutura adiciona o campofirst_name
à linha do log em que ele é usado. O valor desse campo corresponde à variável com o mesmo nome.
use lambda_runtime::{service_fn, Error, LambdaEvent};
use serde_json::{json, Value};
#[tracing::instrument(skip(event), fields(req_id = %event.context.request_id))]
async fn handler(event: LambdaEvent<Value>) -> Result<Value, Error> {
tracing::info!("Rust function invoked");
let payload = event.payload;
let first_name = payload["firstName"].as_str().unwrap_or("world");
tracing::info!({ %first_name }, "Rust function responds to event");
Ok(json!({ "message": format!("Hello, {first_name}!") }))
}
#[tokio::main]
async fn main() -> Result<(), Error> {
tracing_subscriber::fmt().json()
.with_max_level(tracing::Level::INFO)
// this needs to be set to remove duplicated information in the log.
.with_current_span(false)
// this needs to be set to false, otherwise ANSI color codes will
// show up in a confusing manner in CloudWatch logs.
.with_ansi(false)
// disabling time is handy because CloudWatch will add the ingestion time.
.without_time()
// remove the name of the function from every log entry
.with_target(false)
.init();
lambda_runtime::run(service_fn(handler)).await
}
Quando essa função do Rust é invocada, ela imprime duas linhas de log semelhantes às seguintes:
{"level":"INFO","fields":{"message":"Rust function invoked"},"spans":[{"req_id":"45daaaa7-1a72-470c-9a62-e79860044bb5","name":"handler"}]}
{"level":"INFO","fields":{"message":"Rust function responds to event","first_name":"David"},"spans":[{"req_id":"45daaaa7-1a72-470c-9a62-e79860044bb5","name":"handler"}]}