Registro em aplicações Rust: melhores práticas para iniciantes
\nO 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\nPor que o registro é importante em Rust?
\nRust é 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
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.
Começando com o crate log e env_logger
\nA 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.
Adicione as dependências no Cargo.toml:
[dependencies]\nlog = "0.4"\nenv_logger = "0.10"\nAgora, um exemplo simples:
\nuse 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}\nPor 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:
RUST_LOG=debug cargo run\nVocê verá mensagens de todos os níveis: error, warn, info, debug e trace. Você também pode filtrar por módulos:
RUST_LOG=my_crate=info cargo run\nIsso exibirá apenas mensagens de nível info ou superior para o crate my_crate.
Registro avançado com tracing
\nPara 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.
Adicione as dependências:
\n[dependencies]\ntracing = "0.1"\ntracing-subscriber = "0.3"\nExemplo usando spans:
\nuse 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
Leia também