spdlog для C++: полное руководство с примерами

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

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

Начать курс

Что такое spdlog и зачем он нужен?

spdlog — это сверхбыстрая, header-only библиотека для логирования на C++, распространяемая под лицензией MIT. Её главная особенность — невероятная производительность, достигаемая за счёт асинхронной записи, минимального количества аллокаций и использования современных возможностей C++11/14/17. В бенчмарках spdlog часто оказывается в 5-10 раз быстрее таких библиотек, как glog или Boost.Log.

Зачем использовать spdlog? В любом нетривиальном C++ приложении логирование — это не роскошь, а необходимость. Оно помогает:

  • Отлаживать ошибки в production-среде, где нет отладчика.
  • Отслеживать поток выполнения программы (трассировка).
  • Анализировать производительность (замеры времени выполнения участков кода).
  • Вести аудит безопасности (фиксация попыток входа, изменений данных).

spdlog предоставляет гибкую систему: вы можете писать логи в консоль, в файлы (в том числе с ротацией по размеру или времени), в системный журнал (syslog), в базу данных (через ODBC) или даже отправлять их по сети. Поддерживается асинхронный режим, который позволяет не блокировать основной поток приложения при записи логов.

Установка spdlog

В отличие от Python, в C++ нет единого менеджера пакетов, но есть несколько стандартных способов установки spdlog.

Способ 1: Header-only (рекомендуется для начала)

Самый простой способ — скачать заголовочные файлы и просто включить их в проект. Никакой компиляции не требуется.

  1. Скачайте последний релиз с GitHub.
  2. Распакуйте архив.
  3. Скопируйте папку include/spdlog в ваш проект.
  4. В коде используйте #include "spdlog/spdlog.h".

Способ 2: Через пакетный менеджер vcpkg

vcpkg — популярный менеджер пакетов для C++ от Microsoft.

# Установка
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh  # или bootstrap-vcpkg.bat на Windows
./vcpkg install spdlog

# Интеграция с вашей системой сборки
./vcpkg integrate install

Способ 3: Через Conan

Conan — ещё один популярный менеджер пакетов.

# В файле conanfile.txt
[requires]
spdlog/1.12.0

[generators]
cmake_find_package

# Установка
conan install . --build=missing

Способ 4: CMake FetchContent (современный подход)

Если вы используете CMake, можно подтянуть библиотеку прямо из репозитория:

include(FetchContent)
FetchContent_Declare(
  spdlog
  GIT_REPOSITORY https://github.com/gabime/spdlog.git
  GIT_TAG v1.12.0
)
FetchContent_MakeAvailable(spdlog)

# В вашем target
target_link_libraries(my_app PRIVATE spdlog::spdlog)

Быстрый старт с примером кода

Давайте напишем простейшую программу, которая выводит логи разных уровней в консоль и в файл.

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

int main() {
    // 1. Создаём логгер для консоли (по умолчанию цветной)
    auto console = spdlog::stdout_color_mt("console");

    // 2. Создаём логгер для файла
    auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/app.log");

    // 3. Устанавливаем уровень логирования (по умолчанию - trace)
    spdlog::set_level(spdlog::level::trace);

    // 4. Пишем сообщения разных уровней
    console->trace("Это trace-сообщение (самый подробный уровень)");
    console->debug("Debug: значение переменной x = {}", 42);
    console->info("Программа запущена успешно");
    console->warn("Предупреждение: память почти закончилась");
    console->error("Ошибка: не удалось открыть файл");
    console->critical("Критическая ошибка: приложение будет завершено!");

    // 5. Пишем в файл
    file_logger->info("Запись в файл: {}", "успешно");

    // 6. Меняем формат вывода
    spdlog::set_pattern("[%Y-%m-%d %H:%M:%S] [%^%l%$] [%n] %v");
    console->info("Теперь с новым форматом!");

    // 7. Асинхронное логирование
    spdlog::flush_every(std::chrono::seconds(3)); // Сбрасывать буфер каждые 3 секунды

    return 0;
}

Основные методы и функции spdlog

Рассмотрим ключевые методы библиотеки. Для каждого приведём описание, параметры и пример.

1. spdlog::stdout_color_mt() — создание цветного консольного логгера

Что делает: Создаёт и регистрирует логгер, который выводит сообщения в стандартный поток вывода (stdout) с цветовой подсветкой в зависимости от уровня логирования. "mt" означает multi-threaded (потокобезопасный).

Параметры:

  • logger_name (std::string) — уникальное имя логгера. Если логгер с таким именем уже существует, будет выброшено исключение spdlog::spdlog_ex.

Возвращает: Умный указатель std::shared_ptr<spdlog::logger>.

Пример:

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

int main() {
    auto logger = spdlog::stdout_color_mt("my_console");
    logger->info("Цветной консольный логгер создан!");
    return 0;
}

2. spdlog::basic_logger_mt() — создание файлового логгера

Что делает: Создаёт логгер, который пишет сообщения в обычный текстовый файл. Если файл не существует, он будет создан. Если существует — данные будут дописываться в конец.

Параметры:

  • logger_name (std::string) — имя логгера.
  • filename (std::string) — путь к файлу для записи логов.
  • truncate (bool, опционально) — если true, файл будет перезаписан при открытии. По умолчанию false.

Пример:

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

int main() {
    auto file_logger = spdlog::basic_logger_mt("file_log", "logs/application.log");
    file_logger->info("Первая запись в файл");
    return 0;
}

3. spdlog::rotating_logger_mt() — логгер с ротацией по размеру

Что делает: Создаёт логгер, который автоматически создаёт новый файл, когда текущий достигает заданного размера. Старые файлы могут быть удалены, если их количество превышает лимит.

Параметры:

  • logger_name (std::string) — имя логгера.
  • filename (std::string) — базовое имя файла.
  • max_file_size (size_t) — максимальный размер файла в байтах.
  • max_files (size_t) — максимальное количество файлов для хранения.

Пример:

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

int main() {
    // Ротация при достижении 5 МБ, хранить не более 3 файлов
    auto logger = spdlog::rotating_logger_mt("rotating", "logs/app.log", 5 * 1024 * 1024, 3);
    for (int i = 0; i < 10000; ++i) {
        logger->info("Сообщение номер {}", i);
    }
    return 0;
}

4. spdlog::daily_logger_mt() — логгер с ротацией по времени

Что делает: Создаёт новый файл лога каждый день (или с заданным интервалом). В имя файла подставляется дата.

Параметры:

  • logger_name (std::string) — имя логгера.
  • filename (std::string) — базовое имя файла.
  • hour (int) — час дня (0-23), когда создаётся новый файл.
  • minute (int) — минута (0-59).

Пример:

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

int main() {
    // Новый файл каждый день в 23:59
    auto logger = spdlog::daily_logger_mt("daily", "logs/daily_log.txt", 23, 59);
    logger->info("Запись в ежедневный лог");
    return 0;
}

5. set_level() — установка уровня логирования

Что делает: Устанавливает глобальный минимальный уровень логирования. Сообщения с уровнем ниже указанного будут игнорироваться. Это позволяет в production отключить отладочные сообщения для повышения производительности.

Параметры:

  • log_level (spdlog::level::level_enum) — один из уровней: trace, debug, info, warn, error, critical, off.

Пример:

#include "spdlog/spdlog.h"

int main() {
    spdlog::set_level(spdlog::level::warn); // Показывать только warn и выше
    spdlog::info("Это не будет выведено");   // Игнорируется
    spdlog::warn("Это будет выведено");      // Выводится
    return 0;
}

6. set_pattern() — настройка формата вывода

Что делает: Устанавливает глобальный шаблон форматирования для всех логгеров. Можно задать, какие поля и в каком порядке выводить.

Параметры:

  • pattern (std::string) — строка шаблона. Основные флаги:
    • %v — само сообщение
    • %l — уровень логирования (info, warn...)
    • %^ и %$ — начало и конец цветового выделения
    • %n — имя логгера
    • %Y-%m-%d %H:%M:%S — дата и время
    • %t — ID потока
    • %@ — имя файла и номер строки (требует макросов SPDLOG_ACTIVE_LEVEL)

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