Registro em C++: melhores práticas para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Registro em aplicações C++: melhores práticas para iniciantes



Registro (logging) é o processo de gravar eventos que ocorrem durante a execução de um programa. Para um desenvolvedor C++ iniciante, saber organizar corretamente o registro não é apenas uma "boa prática", mas uma habilidade criticamente importante. Ele ajuda a depurar código, rastrear erros em produção e analisar o comportamento do sistema. Neste artigo, vamos abordar as melhores práticas de registro em C++, desde as formas mais simples até o uso de bibliotecas modernas, com exemplos de código concretos.



Por que usar simplesmente std::cout é uma má prática?



Muitos iniciantes começam exibindo mensagens de depuração através de std::cout ou printf. É rápido e simples, mas essa abordagem tem sérias desvantagens:



  • Falta de níveis de importância. Não é possível separar mensagens de erro de notificações informativas.
  • Dificuldade de filtragem. Em produção, você não quer ver toneladas de mensagens de depuração, mas durante a depuração elas são necessárias.
  • Sem rotação de arquivos. O arquivo de log crescerá infinitamente até encher todo o disco.
  • Problemas com multithreading. A saída de diferentes threads pode se misturar.


Em vez disso, você deve usar ferramentas especializadas. Vamos considerar três abordagens principais: do simples ao complexo.



1. Um wrapper simples com macros para iniciantes



Se você está escrevendo um pequeno programa de estudo ou não quer incluir bibliotecas de terceiros, pode criar um wrapper simples com macros. Isso já é melhor do que usar cout puro.



#include <iostream>#include <fstream>#include <ctime>#include <string>

enum LogLevel { DEBUG, INFO, WARNING, ERROR};

std::string getCurrentTime() { std::time_t now = std::time(nullptr); char buf[20]; std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", std::localtime(&now)); return std::string(buf);}

#define LOG(level, msg) \ do { \ std::ofstream logFile("app.log", std::ios::app); \ logFile << "[" << getCurrentTime() << "] " \ << "[" << #level << "] " \ << msg << std::endl; \ } while(0)

int main() { LOG(INFO, "Programa iniciado"); int x = 42; LOG(DEBUG, "Valor de x: " << x); // ... LOG(ERROR, "Ocorreu um erro de divisão por zero"); return 0;}


Vantagens: simplicidade, não requer dependências externas.

Desvantagens: sem rotação, operação lenta (abrir/fechar arquivo para cada mensagem), problemas com threads.



2. Uso da biblioteca spdlog (recomendado para iniciantes)



spdlog é a biblioteca de registro mais popular em C++ (mais de 23.000 estrelas no GitHub). Ela é muito rápida, simples de usar e header-only (apenas arquivos de cabeçalho).



Instalação: basta baixar os arquivos do repositório ou usar vcpkg/conan.



#include <spdlog/spdlog.h>#include <spdlog/sinks/basic_file_sink.h>#include <spdlog/sinks/stdout_color_sinks.h>

int main() { // Cria um logger de console com saída colorida auto console = spdlog::stdout_color_mt("console"); // Cria um logger de arquivo auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/app.log"); // Define o nível de registro spdlog::set_level(spdlog::level::debug); // Registrar tudo a partir de DEBUG // Exemplos de mensagens de diferentes níveis console->trace("Esta é uma mensagem trace (nível mais baixo)"); console->debug("Mensagem de depuração: variável x = {}", 42); console->info("Programa iniciado com sucesso"); console->warn("A

Blogs

Book Recommendations