Sua aplicação C++ é uma caixa-preta? Está na hora de mudar isso!
\n\nImagine a situação: você iniciou um serviço C++ de alta carga, tudo funciona perfeitamente. Passa uma semana, outra — e de repente os usuários reclamam de lentidão. Você vai até o código, coloca std::cout em pontos críticos, recompila, reinicia... Familiar? Se sim, este artigo é para você.
No mundo da produção C++, monitoramento e registro não são um luxo, mas uma necessidade. Sem eles, você está cego como uma toupeira em um quarto escuro. Mas a boa notícia é que o C++ moderno (especialmente a partir do C++17) fornece todas as ferramentas para criar um sistema transparente e observável.
\n\nNeste artigo, vamos abordar como transformar sua aplicação de uma "caixa-preta" em um sistema totalmente transparente usando bibliotecas e técnicas reais. Você aprenderá como registrar de forma que os logs sejam úteis, e não apenas ruído, e como configurar um monitoramento que realmente ajude na implantação.
\n\nPor que apenas std::cout é um problema?
\n\nMuitos desenvolvedores C++ iniciantes escrevem assim:
\n\nstd::cout << "Erro: arquivo não encontrado" << std::endl;\n\nÀ primeira vista, parece normal. Mas vamos pensar nos problemas:
\n\n- \n
- Sem níveis de importância. Você não consegue distinguir uma mensagem de debug de um erro crítico. \n
- Sem carimbos de data/hora. Quando isso aconteceu? Ontem? Um segundo atrás? \n
- Sem contexto. Qual thread? Qual requisição? Quais dados? \n
- Saída bloqueante.
std::endllibera o buffer, o que prejudica o desempenho em sistemas de alta carga. \n - Sem rotação. O arquivo de log crescerá infinitamente até ocupar todo o disco. \n
Resumindo, std::cout serve apenas para projetos de brinquedo. Para produção C++ séria, é necessária uma abordagem séria para registro de aplicações C++.
Spdlog: seu novo melhor amigo
\n\nA biblioteca spdlog é o padrão ouro para registro em C++ moderno. Ela é rápida (uma das mais rápidas), header-only (não precisa compilar) e incrivelmente flexível. Vamos ver como configurá-la corretamente.
\n\nInstalação e configuração básica
\n\nO Spdlog pode ser incluído via CMake FetchContent ou simplesmente copiando os cabeçalhos. Aqui está uma configuração mínima para produção:
\n\n#include <spdlog/spdlog.h>\n#include <spdlog/sinks/rotating_file_sink.h>\n#include <spdlog/sinks/stdout_color_sinks.h>\n#include <memory>\n\nvoid setup_logging() {\n // Cria um logger de console com saída colorida\n auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();\n \n // Cria um logger de arquivo com rotação: 5 arquivos de 10 MB\n auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(\n "logs/myapp.log", // caminho do arquivo\n 10 * 1024 * 1024, // tamanho máximo do arquivo: 10 MB\n 5 // número de arquivos para rotação\n );\n\n // Combina em um logger multi-thread\n auto logger = std::make_shared<spdlog::logger>(\n "main_logger",\n spdlog::sinks_init_list{console_sink, file_sink}\n );\n\n // Define o formato: [hora] [nível] [nome_do_logger] mensagem\n logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%n] %v");\n \n // Define o nível de registro global (pode ser alterado em tempo de execução)\n logger->set_level(spdlog::level::info);\n \n // Registra como logger global\n spdlog::set_default_logger(logger);\n}\n\nint main() {\n setup_logging();\n \n spdlog::info("Aplicação iniciada. Versão: {}", APP_VERSION);\n spdlog::warn("Configuração não encontrada, usando valores padrão");\n \n try {\n // algum código\n throw std::runtime_error("Erro de conexão com o BD");\n } catch (const std