Logging para C++: melhores soluções
Logging é um componente criticamente importante de qualquer projeto C++ sério. Ele ajuda a rastrear a execução do programa, encontrar erros, analisar desempenho e auditar ações de usuários. Diferente do Python, onde o módulo embutido logging é o padrão de facto, em C++ não existe uma solução embutida única. No entanto, a comunidade criou várias bibliotecas poderosas e flexíveis. Neste artigo, vamos analisar as melhores delas: spdlog, Google glog, Boost.Log e Easylogging++.
Critérios para escolher uma biblioteca de logging
Antes de prosseguir com a visão geral, é importante entender no que prestar atenção ao escolher:
- Desempenho: impacto mínimo na velocidade de execução da aplicação.
- Flexibilidade: possibilidade de configurar formatos, níveis de logging (DEBUG, INFO, WARN, ERROR) e saídas (arquivo, console, syslog).
- Simplicidade de integração: bibliotecas header-only são preferíveis para projetos pequenos.
- Suporte a multithreading: segurança em threads e gravação assíncrona.
- Licença: compatibilidade com projetos comerciais (MIT, Apache, Boost).
1. spdlog — o mais rápido e moderno
spdlog é uma biblioteca header-only (opcionalmente compilável), escrita em C++11/14/17. Ela é merecidamente considerada a mais popular devido à sua velocidade relâmpago e consumo mínimo de memória. spdlog suporta logging assíncrono, o que é especialmente importante para sistemas de alta carga.
Principais funcionalidades:
- Segurança em threads pronta para uso.
- Múltiplos sinks: arquivos, console, syslog, rotatable files, daily files.
- Suporte a formatadores personalizados (baseados em fmtlib).
- Modo assíncrono com fila de mensagens.
- Logging condicional.
Exemplo de uso:
#include "spdlog/spdlog.h"#include "spdlog/sinks/basic_file_sink.h"
int main() { // Criamos um logger que escreve em arquivo auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/app.log"); spdlog::set_default_logger(file_logger); spdlog::set_level(spdlog::level::debug);
// Registramos mensagens spdlog::info("Aplicação iniciada"); spdlog::warn("Comportamento suspeito detectado: {}", 42); spdlog::error("Erro crítico: {}", errno);
// Logging assíncrono spdlog::flush_every(std::chrono::seconds(3)); return 0;}Quando escolher: para projetos modernos onde a velocidade é crítica. Ideal para jogos, servidores em tempo real e sistemas embarcados.
2. Google glog — um padrão testado pelo tempo
Google glog (Google Logging Library) é uma biblioteca desenvolvida pela Google para necessidades internas. Ela é simples, confiável e usada em milhares de projetos ao redor do mundo. glog não tenta ser o mais rápido, mas fornece todas as funções necessárias para logging em produção.
Características:
- Rotação automática de logs por tamanho.
- Níveis de logging: INFO, WARNING, ERROR, FATAL (com abort).
- Logging condicional (LOG_IF, LOG_EVERY_N).
- Suporte a stack trace em erros fatais.
- Dependência mínima — apenas pthreads.
Exemplo de uso:
#include <glog/logging.h>
int main(int argc, char* argv[]) { google::InitGoogleLogging(argv[0]); FLAGS_log_dir = "./logs"; FLAGS_minloglevel = google::INFO;
LOG(INFO) << "Servidor iniciado na porta " << 8080; LOG(WARNING) << Também na biblioteca
Trabalhando com Markdown em C++: bibliotecas md4c, cmark e cpp-markdown
ORM para Java: comparação de Hibernate, MyBatis e JPA com exemplos
Cliente OAuth para TypeScript: integração de autorização em aplicações web
AddressSanitizer para C++: guia completo com exemplos práticos