Логирование в C++: обзор лучших библиотек и решений

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

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

Начать курс

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

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

Зачем нужно логирование в C++?

В современных C++-проектах логирование решает несколько задач:

  • Отладка: запись значений переменных, стека вызовов, состояния объектов.
  • Мониторинг: фиксация времени выполнения функций, операций ввода-вывода.
  • Аудит: сохранение истории действий пользователя или системы.
  • Диагностика сбоев: запись исключений и критических ошибок.

Хорошая библиотека логирования должна быть быстрой, гибкой, поддерживать разные уровни логов (debug, info, warn, error, fatal) и уметь выводить данные в файл, консоль или удалённый сервер.

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

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

  • Высокая производительность (асинхронное логирование).
  • Поддержка множества sinks: файл, консоль, syslog, базы данных.
  • Гибкая настройка форматирования.
  • Простой API.

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

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

int main() {
    // Создаём логгер, пишущий в файл "logs.txt"
    auto logger = spdlog::basic_logger_mt("file_logger", "logs.txt");
    spdlog::set_default_logger(logger);
    spdlog::set_level(spdlog::level::debug); // Уровень логирования

    spdlog::info("Welcome to spdlog!");
    spdlog::debug("Some debug message: {}", 42);
    spdlog::error("Error occurred: {}", errno);

    // Асинхронное логирование
    spdlog::flush_on(spdlog::level::err);
    return 0;
}

spdlog поддерживает также асинхронный режим, что критично для высоконагруженных приложений. Настройка асинхронности тривиальна: достаточно вызвать spdlog::init_thread_pool(...).

2. Boost.Log — мощный, но тяжеловесный

Boost.Log входит в состав библиотек Boost. Это наиболее функциональное решение, но оно требует установки Boost и может замедлять компиляцию. Особенности:

  • Максимальная гибкость: кастомные фильтры, форматеры, sinks.
  • Поддержка многопоточности и потоковой безопасности.
  • Возможность писать логи в разные места одновременно (файл + консоль + сеть).
  • Поддержка ротации логов по размеру, дате или времени.

Пример Boost.Log:

#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/utility/setup/file.hpp>

namespace logging = boost::log;

int main() {
    // Настройка вывода в файл
    logging::add_file_log("sample.log");
    logging::core::get()->set_filter(
        logging::trivial::severity >= logging::trivial::info
    );

    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    return 0;
}

Boost.Log — выбор для enterprise-проектов, где нужна максимальная кастомизация и уже используется Boost.

3. Google glog — простота и надёжность

glog — библиотека от Google. Она минималистична, проста в использовании и хорошо документирована. Основные характеристики:

  • Автоматическая ротация логов по размеру.
  • Поддержка уровней: INFO, WARNING, ERROR, FATAL.
  • Запись в stderr по умолчанию.
  • <

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