Registro em Rust: melhores práticas para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Registro em aplicações Rust: melhores práticas para iniciantes

\n

O registro (logging) é um dos aspectos mais importantes do desenvolvimento de qualquer aplicação. Ele ajuda a rastrear erros, analisar desempenho e entender o comportamento do sistema em produção. No ecossistema Rust, existem várias bibliotecas poderosas para registro que permitem configurar flexivelmente a saída de mensagens. Neste artigo, vamos explorar as melhores práticas de registro em Rust para iniciantes, começando com conceitos básicos e terminando com exemplos reais de código.

\n\n

Por que o registro é importante em Rust?

\n

Rust é uma linguagem de programação de sistemas, frequentemente usada para criar aplicações de alta carga e criticamente importantes. Nesses sistemas, cada erro pode levar a consequências graves. O registro permite:

\n
    \n
  • Capturar erros — mesmo que a aplicação não falhe, os logs ajudam a entender o que deu errado.
  • \n
  • Monitorar desempenho — meça o tempo de execução das funções e encontre gargalos.
  • \n
  • Depurar cenários complexos — em aplicações multithread, os logs são indispensáveis para entender a ordem de execução.
  • \n
  • Garantir transparência — em produção, você poderá ver o que está acontecendo com a aplicação em tempo real.
  • \n
\n

Em Rust, a biblioteca padrão não inclui um logger embutido, mas a comunidade criou excelentes crates (bibliotecas) para essa tarefa. Vamos abordar os dois mais populares: log + env_logger e tracing.

\n\n

Começando com o crate log e env_logger

\n

A maneira mais simples de adicionar registro em uma aplicação Rust é usar a combinação dos crates log e env_logger. log fornece macros abstratas para registro, enquanto env_logger é uma implementação concreta que é configurada através de variáveis de ambiente.

\n

Adicione as dependências no Cargo.toml:

\n
[dependencies]\nlog = "0.4"\nenv_logger = "0.10"
\n

Agora, um exemplo simples:

\n
use log::{info, warn, error, debug};\n\nfn main() {\n    env_logger::init();\n\n    info!("Aplicação iniciada");\n    debug!("Modo de depuração ativo");\n    warn!("Este é um aviso");\n    error!("Ocorreu um erro: {}", "código desconhecido");\n}
\n

Por padrão, env_logger exibe apenas mensagens de nível error ou superior. Para ver todos os níveis, defina a variável de ambiente RUST_LOG:

\n
RUST_LOG=debug cargo run
\n

Você verá mensagens de todos os níveis: error, warn, info, debug e trace. Você também pode filtrar por módulos:

\n
RUST_LOG=my_crate=info cargo run
\n

Isso exibirá apenas mensagens de nível info ou superior para o crate my_crate.

\n\n

Registro avançado com tracing

\n

Para aplicações mais complexas (servidores web, sistemas assíncronos), recomenda-se usar o crate tracing. Ele suporta registro estruturado, spans e eventos, o que é especialmente útil para rastrear cadeias de chamadas em código assíncrono.

\n

Adicione as dependências:

\n
[dependencies]\ntracing = "0.1"\ntracing-subscriber = "0.3"
\n

Exemplo usando spans:

\n
use tracing::{info, error, span, Level};\nuse tracing_subscriber;\n\nfn main() {\n    tracing_subscriber::fmt::init();\n\n    let outer_span = span!(Level::INFO, "outer", work_id = 42);\n    let _enter = outer_span.enter();\n\n    info!("Iniciando trabalho");\n    process_data();\n    info!("Trabalho concluído");\n}\n\nfn process_data() {\n    let inner_span = span!(Level::DEBUG, "process_data", data_id = 100);\n    let _enter = inner_span.enter();\n\n    // Simulação de erro\n    if true {\n        error!("Erro ao processar dados: ID {}", 100);\n    }\n}

Blogs

Book Recommendations