Introdução: Por que a registração é criticamente importante em Rust
A registração não é apenas gravar eventos em um arquivo. Em sistemas de alta carga e seguros, onde Rust encontra sua principal aplicação (servidores web, utilitários CLI, sistemas embarcados), os logs são a única fonte da verdade na depuração e monitoramento. Rust oferece um ecossistema onde a escolha da abordagem correta para registração pode impactar significativamente o desempenho e a facilidade de manutenção do código.
Neste artigo, abordaremos os princípios básicos de registração em Rust, começando com a crate base log e terminando com ferramentas avançadas como tracing. Você aprenderá como evitar erros comuns, configurar níveis de registro e estruturar a saída para análise.
Fundamentos: A crate log e a arquitetura de fachada
Em Rust, o padrão de facto é a crate log. Ela fornece uma fachada (abstração) que não depende de um backend específico. Você escreve código usando as macros log::info!, log::error!, e a escolha da implementação (para onde escrever: arquivo, console, syslog) fica a cargo do usuário da biblioteca.
Instalação e configuração básica
Adicione ao Cargo.toml:
[dependencies]log = "0.4"env_logger = "0.11"env_logger é o backend mais popular para saída em stderr. Ele é configurado através da variável de ambiente RUST_LOG.
Exemplo de registração simples
use log::{info, warn, error};
fn main() { env_logger::init();
info!("Aplicação iniciada"); warn!("Este é um aviso"); error!("Erro crítico: {}", 42);}Execute com o nível: RUST_LOG=info cargo run. Você verá apenas info e acima. Se a variável não for definida, os logs não serão exibidos.
Níveis de registro
Em log são definidos 5 níveis (em ordem crescente de prioridade):
trace— informação de depuração extremamente detalhada (por exemplo, entrada/saída de função).debug— útil para o desenvolvedor durante a depuração.info— eventos importantes da aplicação (inicialização, parada, operações bem-sucedidas).warn— situações potencialmente perigosas que não interrompem o funcionamento.error— erros irreparáveis que exigem intervenção.
Dica: Em produção, use o nível info ou warn. trace e debug é melhor deixar para o desenvolvimento.
Melhores práticas: Como escrever logs corretamente
Apenas inserir info!("Something") não é suficiente. Para que os logs sejam úteis, siga estas regras.
1. Logs estruturados em vez de strings
Evite concatenação manual de strings. Use campos nomeados. Em log, isso é feito através de formatação:
let user_id = 123;let action = "login";info!("Usuário {} executou {}", user_id, action);Para estruturação avançada (JSON), use a crate slog ou tracing.
2. Contexto e identificadores
Sempre adicione contexto: request_id, user_id, session_id. Isso permite vincular logs em sistemas distribuídos.
warn!("Erro de validação", user_id = user_id, field = "email", reason = "formato inválido");3. Evite registrar em loops críticos
Registração é uma operação cara (entrada-saída). Não coloque trace! dentro de loops com milhões de iterações. Use registro condicional ou contadores de métricas.
4. Use RUST_LOG para configuração flexível
Você pode filtrar logs por módulos e crates:
RUST_LOG="warn,my_crate=debug,othe