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

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

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

Начать курс

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

Логирование — критически важный компонент любого серьёзного C++ проекта. Оно помогает отслеживать выполнение программы, находить ошибки, анализировать производительность и аудировать действия пользователей. В отличие от Python, где встроенный модуль logging является стандартом де-факто, в C++ нет единого встроенного решения. Однако сообщество создало несколько мощных и гибких библиотек. В этой статье мы рассмотрим лучшие из них: spdlog, Google glog, Boost.Log и Easylogging++.

Критерии выбора библиотеки логирования

Прежде чем перейти к обзору, важно понимать, на что обращать внимание при выборе:

  • Производительность: минимальное влияние на скорость работы приложения.
  • Гибкость: возможность настройки форматов, уровней логирования (DEBUG, INFO, WARN, ERROR) и выводов (файл, консоль, syslog).
  • Простота интеграции: header-only библиотеки предпочтительнее для небольших проектов.
  • Поддержка многопоточности: потокобезопасность и асинхронная запись.
  • Лицензия: совместимость с коммерческими проектами (MIT, Apache, Boost).

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

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

Основные возможности:

  • Потокобезопасность из коробки.
  • Множество сиков (sinks): файловые, консольные, syslog, rotatable files, daily files.
  • Поддержка пользовательских форматтеров (на основе fmtlib).
  • Асинхронный режим с очередью сообщений.
  • Условное логирование.

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

#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_default_logger(file_logger);
    spdlog::set_level(spdlog::level::debug);

    // Логируем сообщения
    spdlog::info("Приложение запущено");
    spdlog::warn("Обнаружено подозрительное поведение: {}", 42);
    spdlog::error("Критическая ошибка: {}", errno);

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

Когда выбирать: для современных проектов, где скорость критична. Идеально подходит для игр, серверов реального времени и embedded-систем.

2. Google glog — проверенный временем стандарт

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

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

  • Автоматическое ротация логов по размеру.
  • Уровни логирования: INFO, WARNING, ERROR, FATAL (с abort).
  • Условное логирование (LOG_IF, LOG_EVERY_N).
  • Поддержка стека вызовов при фатальных ошибках.
  • Минимальная зависимость — только pthreads.

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

#include <glog/logging.h>

int main(int argc, char* argv[]) {
    google::InitGoogleLogging(argv[0]);
    FLAGS_log_dir = "./logs";
    FLAGS_minloglevel = google::INFO;

    LOG(INFO) << "Сервер запущен на порту " << 8080;
    LOG(WARNING) << "Низкий запас памяти: " << memory_free << " MB";
    LOG_IF(ERROR, error_code != 0) << "Ошибка подключения: " << error_code;

    // FATAL завершает программу
    // LOG(FATAL) << "Неизвестная команда";

    google::ShutdownGoogleLogging();
    return 0;
}

Когда выбирать: для крупных проектов, где важна стабильность и совместимость с экосистемой Google (например, Tensor

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