Registro para C++: melhores soluções
O registro é uma das ferramentas mais importantes no arsenal do desenvolvedor. Ele ajuda a rastrear a execução do programa, encontrar erros, analisar o desempenho e coletar dados para depuração. Na linguagem C++ não há um sistema de registro embutido (ao contrário de Java ou Python), mas a comunidade e grandes empresas criaram muitas bibliotecas excelentes. Neste artigo, veremos as melhores soluções para registro em C++: spdlog, Boost.Log, Google glog e fmtlog. Você conhecerá suas características, vantagens e obterá exemplos de código.
Por que o registro é necessário em C++?
Em projetos modernos de C++, o registro resolve várias tarefas:
- Depuração: gravação de valores de variáveis, pilha de chamadas, estado de objetos.
- Monitoramento: registro do tempo de execução de funções, operações de entrada/saída.
- Auditoria: armazenamento do histórico de ações do usuário ou sistema.
- Diagnóstico de falhas: registro de exceções e erros críticos.
Uma boa biblioteca de registro deve ser rápida, flexível, suportar diferentes níveis de log (debug, info, warn, error, fatal) e ser capaz de enviar dados para arquivo, console ou servidor remoto.
1. spdlog — logger rápido e moderno
spdlog é a biblioteca de registro mais popular em C++ atualmente. Ela é escrita em C++ moderno (C++11/14/17), header-only (apenas arquivos de cabeçalho) e não tem dependências externas, exceto fmtlib para formatação de strings. Principais vantagens:
- Alta performance (registro assíncrono).
- Suporte a múltiplos sinks: arquivo, console, syslog, bancos de dados.
- Configuração flexível de formatação.
- API simples.
Exemplo de uso do spdlog:
#include <spdlog/spdlog.h>#include <spdlog/sinks/basic_file_sink.h>
int main() { // Criando um logger que escreve no arquivo "logs.txt" auto logger = spdlog::basic_logger_mt("file_logger", "logs.txt"); spdlog::set_default_logger(logger); spdlog::set_level(spdlog::level::debug); // Nível de log
spdlog::info("Bem-vindo ao spdlog!"); spdlog::debug("Mensagem de debug: {}", 42); spdlog::error("Erro ocorrido: {}", errno);
// Registro assíncrono spdlog::flush_on(spdlog::level::err); return 0;}O spdlog também suporta o modo assíncrono, que é crítico para aplicações de alta carga. A configuração da assincronicidade é trivial: basta chamar spdlog::init_thread_pool(...).
2. Boost.Log — poderoso, mas pesado
Boost.Log faz parte das bibliotecas Boost. É a solução mais funcional, mas requer a instalação do Boost e pode tornar a compilação mais lenta. Características:
- Máxima flexibilidade: filtros personalizados, formatadores, sinks.
- Suporte a multithreading e segurança de thread.
- Possibilidade de escrever logs em diferentes lugares simultaneamente (arquivo + console + rede).
- Suporte a rotação de logs por tamanho, data ou hora.
Exemplo do Boost.Log:
#include <boost/log/trivial.hpp>#include <boost/log/expressions.hpp>#include <boost/log/utility/setup/file.hpp>
namespace logging = boost::log;
int main() { // Configuração de saída para arquivo logging::add_file_log("sample.log"); logging::core::get()->set_filter( logging::trivial::severity >= logging::trivial::info );
BOOST_LOG_TRIVIAL(trace) << "Uma mensagem de nível trace"; BOOST_LOG_TRIVIAL(debug) << "Uma mensagem de nível debug"; BOOST_LOG_TRIVIAL(error) << "Uma mensagem de nível error"; return 0;}Boost.Log — escol
Também na biblioteca
Frameworks CLI para Rust: visão geral das melhores ferramentas para criar utilitários de linha de comando
Biblioteca Padrão JavaScript (Node.js): visão geral completa
TypeORM para TypeScript: guia completo com exemplos
Envio de SMS em TypeScript: API da biblioteca sms-client-ts