Snel C++-loggen Zonder De Pijn En Zware Afhankelijkheden
Iedereen die iets complexers dan tutorialscripts in C++ heeft geschreven, heeft te maken gehad met de keuze voor een logging-bibliotheek. De standaard std::cout is handig voor eenvoudige console-hulpprogramma's, maar wordt snel een bottleneck vanwege trage I/O en gebrek aan handige opmaak. Alternatieven zoals Boost.Log of log4cxx brengen hun afhankelijkheden mee, duren lang om te compileren, en zijn intimiderend met hun complexe configuratie.
In 2014 publiceerde ontwikkelaar Gabriel Melman de spdlog bibliotheek. Het project won snel populariteit in de C++-gemeenschap en heeft nu bijna 30.000 sterren op GitHub.
Wat Maakt Het Populair
De belangrijkste reden voor het succes van de bibliotheek is de balans tussen prestaties en gebruiksgemak. spdlog wordt gedistribueerd in header-only formaat: je kopieert eenvoudigweg de include directory naar je project, neemt het header-bestand op, en kunt aan de slag. Als je de build van je applicatie wilt versnellen, kan de bibliotheek vooraf worden gecompileerd via CMake of geïnstalleerd worden via de meest populaire package managers (apt, brew, vcpkg, conan).
String-opmaak is gebouwd op de fmt bibliotheek, die de basis werd voor std::format in C++20. Dit elimineert omslachtige chains met de << operator. Uitlijning, hexadecimale getaloutput en positionele argumenten worden eenvoudig en duidelijk geschreven.
Nuttige Functies Voor Dagelijkse Ontwikkeling
Log Sinks Combineren
In de praktijk moet je vaak fouten naar de console sturen met kleurmarkering, terwijl je gedetailleerde debug-informatie naar een bestand met rotatie schrijft. In spdlog wordt deze taak opgelost door meerdere sinks te combineren in een enkele logger-object:
#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/basic_file_sink.h"
void setup_logging() {
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
console_sink->set_level(spdlog::level::warn);
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/app.txt", true);
file_sink->set_level(spdlog::level::trace);
spdlog::logger logger("multi_sink", {console_sink, file_sink});
logger.info("Сообщение зафиксировано только в файле");
logger.warn("Сообщение попадет и в консоль, и в файл");
}
Asynchrone Modus Voor Zwaar Belaste Taken
In worker threads van netwerkservers of game engines vertragen directe schijfschrijvingen de code-uitvoering. spdlog kan asynchroon werken: een achtergrondthread haalt berichten uit een ringbuffer en spoelt ze naar schijf zonder de hoofdcalculaties te vertragen.
#include "spdlog/async.h"
#include "spdlog/sinks/basic_file_sink.h"
void async_example() {
// Очередь на 8192 элемента и 1 фоновый поток
spdlog::init_thread_pool(8192, 1);
auto async_file = spdlog::basic_logger_mt<spdlog::async_factory>(
"async_logger", "logs/async_log.txt"
);
async_file->info("Запись лога не блокирует текущий поток");
}
Ringbuffer Voor Fouttracering
Een interessante functie van de bibliotheek is ondersteuning voor backtrace. Stel dat de productieomgeving het logniveau heeft ingesteld op info en gedetailleerd debuggen is uitgeschakeld. Wanneer backtrace wordt geactiveerd, slaat de bibliotheek de laatste N debug-berichten op in het geheugen. Wanneer een storing optreedt, kunnen ze onmiddellijk naar het logbestand worden gedumpt.
spdlog::enable_backtrace(32); // Сохраняем последние 32 сообщения в буфер
for (int i = 0; i < 100; ++i) {
spdlog::debug("Отладочный шаг №{}", i); // Сообщения пока не пишутся в диск
}
// При возникновении ошибки выгружаем накопленный буфер
spdlog::dump_backtrace();
Logniveau Veranderen Zonder Opnieuw Bouwen
Logniveaus kunnen direct worden gelezen uit omgevingsvariabelen of opdrachtregelargumenten bij het opstarten van de applicatie:
#include "spdlog/cfg/env.h"
int main(int argc, char* argv[]) {
spdlog::cfg::load_env_levels();
spdlog::info("Приложение успешно запущено");
}
Het uitvoeren van de binary met de SPDLOG_LEVEL=debug ./my_app vlag activeert onmiddellijk de debugberichtoutput.
Prestatiebenchmarks
Een synchrone single-threaded logger verwerkt ongeveer 5,7 miljoen aanroepen per seconde bij het werken met korte strings (auteurstests op Intel i7-4770). Met 10 concurrerende threads blijft de snelheid rond 1,6 miljoen berichten per seconde.
In asynchrone modus met het overflow-beleid (overrun) verwerkt de bibliotheek meer dan 2,6 miljoen bewerkingen per seconde. Deze cijfers worden bereikt door minimale geheugentoewijzingen en snelle stringbouw.
Kant-en-Klare Integraties
De bibliotheek wordt ondersteund op Linux, Windows, macOS, Android en FreeBSD. Het pakket bevat kant-en-klare sinks voor integratie met syslog, Windows Event Log, Android logcat en Qt tekstwidgets (QTextEdit). Daarnaast bevat de codebase een spdlog::stopwatch stopwatch voor het meten van de uitvoeringstijd van codesegmenten en een hulpprogramma voor het uitvoeren van binaire gegevens in hex-formaat.
spdlog lost het logging-probleem op zonder onnodige complexiteit. Voor een klein hulpprogramma is het voldoende om de headerbestanden te kopiëren, en voor een grote service komen de asynchrone modus, bestandsrotatie en vlieggewijs berichtfiltering goed van pas. Als je een snel en voorspelbaar hulpmiddel voor C++ nodig hebt, zou het toevoegen van spdlog aan je stack een topprioriteit moeten zijn.
Gerelateerde projecten