Registro para C++: las mejores soluciones
El registro es un componente crítico de cualquier proyecto serio de C++. Ayuda a rastrear la ejecución del programa, encontrar errores, analizar el rendimiento y auditar las acciones de los usuarios. A diferencia de Python, donde el módulo integrado logging es el estándar de facto, en C++ no existe una solución integrada única. Sin embargo, la comunidad ha creado varias bibliotecas potentes y flexibles. En este artículo, analizaremos las mejores: spdlog, Google glog, Boost.Log y Easylogging++.
Criterios para elegir una biblioteca de registro
Antes de pasar a la revisión, es importante entender qué tener en cuenta al elegir:
- Rendimiento: mínimo impacto en la velocidad de la aplicación.
- Flexibilidad: posibilidad de configurar formatos, niveles de registro (DEBUG, INFO, WARN, ERROR) y salidas (archivo, consola, syslog).
- Facilidad de integración: las bibliotecas header-only son preferibles para proyectos pequeños.
- Soporte para subprocesos múltiples: seguridad en subprocesos y escritura asíncrona.
- Licencia: compatibilidad con proyectos comerciales (MIT, Apache, Boost).
1. spdlog — el más rápido y moderno
spdlog es una biblioteca header-only (opcionalmente compilable), escrita en C++11/14/17. Con razón se considera la más popular gracias a su velocidad ultrarrápida y mínimo consumo de memoria. spdlog admite registro asíncrono, lo que es especialmente importante para sistemas de alta carga.
Características principales:
- Seguridad en subprocesos lista para usar.
- Múltiples sinks: de archivo, consola, syslog, archivos rotativos, archivos diarios.
- Soporte para formateadores personalizados (basados en fmtlib).
- Modo asíncrono con cola de mensajes.
- Registro condicional.
Ejemplo de uso:
#include "spdlog/spdlog.h"#include "spdlog/sinks/basic_file_sink.h"
int main() { // Creamos un logger que escribe en archivo 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 mensajes spdlog::info("Aplicación iniciada"); spdlog::warn("Comportamiento sospechoso detectado: {}", 42); spdlog::error("Error crítico: {}", errno);
// Registro asíncrono spdlog::flush_every(std::chrono::seconds(3)); return 0;}Cuándo elegirlo: para proyectos modernos donde la velocidad es crítica. Ideal para juegos, servidores en tiempo real y sistemas embebidos.
2. Google glog — un estándar probado por el tiempo
Google glog (Google Logging Library) es una biblioteca desarrollada por Google para necesidades internas. Es simple, confiable y se utiliza en miles de proyectos en todo el mundo. glog no pretende ser el más rápido, pero proporciona todas las funciones necesarias para el registro en producción.
Características:
- Rotación automática de registros por tamaño.
- Niveles de registro: INFO, WARNING, ERROR, FATAL (con abort).
- Registro condicional (LOG_IF, LOG_EVERY_N).
- Soporte de pila de llamadas en errores fatales.
- Dependencia mínima — solo pthreads.
Ejemplo 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 en el puerto " << 8080; LOG(WARNING) <<