Логирование для C++: лучшие решения (spdlog, glog, P7)

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Логирование для C++: лучшие решения

Логирование — критически важный аспект разработки любого серьёзного приложения на C++. Правильно настроенная система логирования позволяет отслеживать состояние программы, выявлять ошибки, проводить аудит и отладку в production-среде. В отличие от простых std::cout, профессиональные библиотеки предоставляют уровни важности (trace, debug, info, warn, error, fatal), ротацию файлов, асинхронную запись и минимальное влияние на производительность. В этой статье мы рассмотрим три лучших решения для C++: spdlog, Google glog и P7.

1. spdlog — быстрый и современный логгер

spdlog — это заголовочная библиотека (header-only), написанная на C++11/14/17. Она считается одним из самых быстрых логгеров в экосистеме C++. Основные преимущества: поддержка асинхронного режима, множество форматов вывода (консоль, файл, syslog, пользовательские), цветной вывод для консоли и минимальное потребление памяти.

Пример базового использования:

#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"

int main() {
    // Создаем файловый логгер
    auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/app.log");
    // Устанавливаем уровень логирования
    spdlog::set_level(spdlog::level::debug);

    // Логируем сообщения
    spdlog::info("Приложение запущено");
    file_logger->warn("Пользователь {} попытался войти с неверным паролем", "admin");
    file_logger->error("Ошибка подключения к базе данных: {}", 404);

    // Асинхронное логирование
    spdlog::flush_every(std::chrono::seconds(3));
    return 0;
}

Ключевые особенности:

  • Производительность: до 5-10 миллионов сообщений в секунду в асинхронном режиме.
  • Гибкость: поддержка sink-ов (выводов) — консоль, файл, syslog, Telegram, Kafka.
  • Ротация файлов: автоматическое создание логов по размеру или времени.
  • Цветной вывод: уровни окрашиваются для быстрой визуальной диагностики.

2. Google glog — проверенный временем логгер

Google glog (glog) — библиотека от Google, разработанная для внутренних нужд компании. Она проста, надёжна и отлично подходит для серверных приложений. Основной упор сделан на категоризацию логов и автоматическую запись в файлы.

Пример использования:

#include <glog/logging.h>

int main(int argc, char* argv[]) {
    google::InitGoogleLogging(argv[0]);

    // Настройка вывода в файл
    FLAGS_log_dir = "./logs";
    FLAGS_stderrthreshold = 1; // Выводить WARNING и выше в stderr

    LOG(INFO) << "Сервер запущен на порту " << 8080;
    LOG(WARNING) << "Низкий уровень памяти: " << 512 << " MB";
    LOG(ERROR) << "Не удалось открыть файл конфигурации";

    // Условное логирование
    int x = 5;
    LOG_IF(INFO, x > 3) << "x больше 3";

    google::ShutdownGoogleLogging();
    return 0;
}

Особенности glog:

  • Автоматическая ротация: файлы создаются по дням и размеру.
  • Условное логирование: LOG_IF, CHECK для проверок.
  • Поддержка сигналов: автоматически логирует дамп стека при краше.
  • Минимальная конфигурация: работает "из коробки".

3. P7 — логгер для высоконагруженных систем

P7 (или P7::Logger) — это библиотека, ориентированная на максимальную производительность и минимальное влияние на latency приложения. Она использует асинхронную очередь и минимизирует блокировки. Идеально подходит для игровых движков, финансовых систем и высоконагруженных микросервисов.

Пример настройки:

#include "P7/P7.h"
#include "P7/Client.h"

int main() {
    // Инициализация с файловым выводом
    IP7_Client* client = P7_Create_Client(TM("P7_Pool"), TM("logs/app.p7"));
    IP7_Trace* trace = P7_C                    

Рекомендаций