Registro para Rust: melhores bibliotecas e ferramentas
O registro é uma parte essencial do desenvolvimento de qualquer aplicação séria. No ecossistema Rust, existem várias soluções maduras que permitem gerenciar flexivelmente a saída de mensagens, definir níveis de importância e formatos. Neste artigo, veremos as bibliotecas mais populares para registro em Rust, suas características e daremos exemplos de uso.
1. Trait base log
A biblioteca log (crate log) é a base para todos os sistemas de registro em Rust. Ela fornece o trait abstrato Log e macros (info!, warn!, error!, debug!, trace!). Por si só, ela não gera saída de dados — para isso, é necessária uma implementação (backend).
// Cargo.toml// [dependencies]// log = "0.4"
use log::{info, warn, error};
fn main() { info!("Aplicação iniciada"); warn!("Baixa memória disponível: {} MB", 128); error!("Erro ao conectar ao banco de dados");}Níveis de registro em ordem crescente de importância: trace, debug, info, warn, error. Por padrão, apenas mensagens de nível info e superiores são exibidas.
2. env_logger — escolha simples e popular
env_logger é a implementação mais comum do trait Log. Ela é configurada através da variável de ambiente RUST_LOG e exibe mensagens no fluxo de erro padrão (stderr).
// Cargo.toml// [dependencies]// log = "0.4"// env_logger = "0.10"
use log::info;
fn main() { env_logger::init(); info!("env_logger inicializado");}
// Execução: RUST_LOG=info cargo runCaracterísticas:
- Configuração mínima — apenas uma linha
env_logger::init()é suficiente. - Filtragem por módulos:
RUST_LOG=my_crate=debug,other_crate=info. - Suporte a saída colorida no terminal.
- Ideal para pequenas utilidades e protótipos.
3. log4rs — alternativa configurável ao log4j/log4net
log4rs (crate log4rs) é um framework poderoso, inspirado no Java log4j. Permite configurar o registro através de arquivos YAML/JSON/TOML ou programaticamente.
// Cargo.toml// [dependencies]// log = "0.4"// log4rs = "1.2"
use log::info;
fn main() { // Configuração programática log4rs::init_file("log4rs.yaml", Default::default()).unwrap(); info!("log4rs configurado via arquivo");}
// log4rs.yaml// refresh_rate: 30 seconds// appenders:// stdout:// kind: console// encoder:// pattern: "{d(%Y-%m-%d %H:%M:%S)} {l} - {m}{n}"// file:// kind: file// path: "app.log"// encoder:// pattern: "{d} {l} {t} - {m}{n}"// root:// level: info// appenders:// - stdout// - fileCaracterísticas:
- Suporte a múltiplos appenders (saída para arquivo, console, syslog, network).
- Rotação automática de logs por tamanho ou tempo.
- Filtragem por módulos, níveis, filtros personalizados.
- Recomendado para aplicações servidoras e microsserviços.
4. tracing — registro assíncrono e estruturado
tracing (crate tracing) é uma alternativa moderna, desenvolvida pela equipe Tokio. Ela suporta eventos estruturados, spans para rastreamento de tempo de execução e contextos assíncronos.
// Cargo.toml// [dependencies]// tracing = "0.1"// tracing-subscriber = "0.3"
use tracing::{info, span, Level};use tracing_subscriber::fmt;
fn main() { // Inicialização do subscriber fmt::init();
let span = span!(Lev