Что такое 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 (рекомендуется для начала)
Самый простой способ — скачать заголовочные файлы и просто включить их в проект. Никакой компиляции не требуется.
- Скачайте последний релиз с GitHub.
- Распакуйте архив.
- Скопируйте папку
include/spdlogв ваш проект. - В коде используйте
#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)
Также в библиотеке
Рекомендаций