Logging para Rust: melhores soluções
Logging é um dos componentes-chave de qualquer aplicação de produção. No ecossistema Rust, existe um conjunto maduro de ferramentas que permite configurar de forma flexível a coleta, formatação e saída de logs. Neste artigo, vamos analisar as principais bibliotecas, suas capacidades e exemplos de uso.
1. Crate log — abstração sobre logging
A biblioteca log é a base de todo o sistema de logging em Rust. Ela fornece uma fachada (facade) — um conjunto de traits e macros que não dependem de um backend específico. Você escreve o código uma vez e a saída dos logs é configurada através de um logger externo.
Macros principais:
error!— erros críticoswarn!— avisosinfo!— mensagens informativasdebug!— informações de depuraçãotrace!— rastreamento detalhado
Exemplo de uso:
use log::{info, warn, error};
fn main() { // Antes de usar, é necessário inicializar o logger // env_logger::init(); // ou outro backend info!("Aplicação iniciada"); warn!("Disco 90% cheio"); error!("Erro de conexão com o BD: {:?}", err);}2. env_logger — simplicidade e flexibilidade
O backend mais popular para log. A configuração é feita através da variável de ambiente RUST_LOG. É a escolha ideal para projetos pequenos e utilitários.
Instalação:
[dependencies]log = "0.4"env_logger = "0.11"Exemplo com filtragem por módulos:
use log::info;
fn main() { env_logger::init(); // Execute: RUST_LOG=my_crate=info cargo run info!("Esta mensagem aparecerá apenas para my_crate"); // RUST_LOG=warn — mostrará apenas warn e error // RUST_LOG=debug — mostrará tudo, incluindo debug}A variável RUST_LOG suporta filtros complexos:
RUST_LOG=info— nível info e acimaRUST_LOG=my_crate=debug,other_crate=warn— níveis diferentes para crates diferentesRUST_LOG=off— desabilitar logging
3. log4rs — configuração via YAML
Se você precisa de controle avançado — múltiplos appenders (arquivo, console, syslog), rotação de logs, formatação — escolha log4rs. Ele é inspirado no Java Log4j.
Exemplo de configuração 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} {M} - {m}{n}"
root: level: info appenders: - stdout
loggers: app::db: level: debug appenders: - file additive: falseInicialização no código:
use log4rs;
fn main() { log4rs::init_file("log4rs.yaml", Default::default()).unwrap(); log::info!("Logging configurado via YAML"); log::debug!("Esta mensagem irá apenas para o arquivo");}Principais capacidades do log4rs:
- Rotação de logs por tamanho ou tempo
- Appenders diferentes para módulos diferentes
- Recarregamento automático da configuração
- Suporte a formato JSON
4. tracing — abordagem moderna
A biblioteca tracing da equipe Tokio não é apenas logging, mas um sistema completo para diagnóstico de aplicações. Ela suporta eventos estruturados e spans, o que é especialmente útil em aplicações assíncronas.
Exemplo com spans:
use tracing::{in