mrkeyoor.com_
Tue 03 Nov 15:35 UTC
Dev Toolsevaluationupdated 29 Oct 2026

spdlog review

spdlog is a C++ logging library with message formatting, log levels, console and file destinations, and optional asynchronous logging. It supports header-only and compiled integration. Applications still need to choose destinations, threading, rotation and flushing policies.

+16stars / 7d
Verdict

spdlog passed all 3 reported CTest entries in our sandbox at commit d6c93f3. That supports a trial for C++ applications needing configurable console and file logging, while installation and application logging behavior remain unverified. Its built-in mapped diagnostic context is unsupported in asynchronous mode. Choose how request context will reach messages, then validate your intended destinations, queue policy and shutdown behavior.

We ran it

Lab card: what happened when we ran spdlogScreenshot of spdlog (github.com/gabime/spdlog)
Install✓ · 11s
Build✓ · 166s
Tests✓ · 68s3 passed · 0 failed of 3 (ctest)
Repo186 files~33,012 lines of source · 1.3 MB · 3 CI workflows · tests dir

Answers from our run

Does spdlog build from source?

Dependencies installed in 11 seconds, and the build succeeded in 166 seconds. We cloned commit d6c93f3 into a clean Debian container with 3 CPUs and no project-specific setup.

Do spdlog's tests pass?

Yes. The project's own test command finished in 68 seconds and reported 3 passed, 0 failed (ctest).

Who should not use spdlog?

Applications that require spdlog's built-in mapped diagnostic context in asynchronous mode: the README explicitly excludes that combination.

What are the alternatives to spdlog?

{fmt}, Quill. spdlog passed all 3 reported CTest entries in our sandbox at commit d6c93f3.

SetupN/AThe recorded build and test steps passed, but installation was not verified and the measurement summary lacks reproducible command lines, so integration effort is not graded.
DocsN/AThe supplied README and release extracts support the configuration guidance here. Full wiki coverage and platform-specific instructions were not comprehensively assessed.
CommunityN/AThe supplied repository metadata and issue sample do not establish typical support responsiveness, adoption or available maintainer capacity.
MaturityN/AThree reported CTest entries passed in one configuration. Sustained logging, shutdown, retention and platform coverage were not assessed by this run.

Discussed on

  1. hnSpdlog: Super fast C++ logging library5 points

Who it’s for

C++ application developers who need console and file output with different message levels.
Teams choosing between header-only and compiled integration.
Developers prepared to validate logging behavior under load and during shutdown.

Who it’s NOT for

Applications that require spdlog's built-in mapped diagnostic context in asynchronous mode: the README explicitly excludes that combination.
Programs combining single-threaded loggers with periodic global flushing: the README requires thread-safe loggers for that operation.
Developers whose needs stop at formatted terminal output and who do not need logger or destination configuration.

Setup reality

Our recorded run at commit d6c93f3 on 2026-10-10 reports that the harness step labelled install succeeded in 11 seconds; installation was not verified. The supplied previous review identifies configuration and generation output without an installation command or installed-binary check. The build succeeded in 166 seconds. Tests succeeded in 68 seconds, with CTest reporting 3 passed and 0 failed of 3.

The recorded sandbox configuration was 3 CPUs, 8 GB RAM and image lab-cpp:1. The image label does not establish the actual compiler or operating-system version. These results cover the recorded configuration; they do not measure logging throughput or verify every documented platform.

The README documents copying the include folder into a build tree for use with a C++11 compiler. It also documents a compiled route and recommends it for faster compile times. Our run did not compare those integration choices. Choose the output path, message levels, threading mode, rotation and flushing behavior before testing the configuration in your application.

Background logging changes how context reaches a message

spdlog's mapped diagnostic context is unsupported in asynchronous mode. The README explains that this context relies on thread-local storage. If your application needs request identifiers in background log output, decide how those identifiers will reach each message before choosing that mode. The recorded build and test result does not validate a context-propagation design.

spdlog documents console output, rotating and daily files, named loggers and message levels. Its multiple-destination example gives console and file output different thresholds and formats. Those controls make it a candidate for applications that need a shared logging policy across several destinations.

What happened when we ran it

Our recorded run used commit d6c93f3 on 2026-10-10. The harness step labelled install succeeded in 11 seconds; installation was not verified. The supplied previous review identifies configuration and generation output without an installation command or installed-binary check. The build succeeded in 166 seconds. Tests succeeded in 68 seconds, with CTest reporting 3 passed and 0 failed of 3. These are reported CTest entries, not a count of individual assertions.

The recorded sandbox configuration was 3 CPUs and 8 GB RAM with image lab-cpp:1. That label does not establish compiler or operating-system versions. The checkout measured 186 files, about 33,012 source lines and 1.3 MB. The scan found a tests directory and three CI workflow files, with no Dockerfile. Those files establish that automation exists, not that every documented platform passed.

The successful build and reported tests support trying the recorded revision in an application branch. The supplied measurements contain no logging workload, queue-saturation result or comparison against another library. The README's performance tables are upstream benchmarks with their own conditions, separate from this run.

Choose integration and configuration separately

The README's header-only instructions say to copy the include folder into your build tree and use a C++11 compiler. It also documents a compiled route, which it recommends for faster compile times. Our setup timings do not compare downstream compilation costs between those routes, and the supplied measurement summary does not include the commands needed to reproduce the exact build.

Named loggers can be retrieved through a global registry. The README also demonstrates changing levels for all registered loggers. If several application components configure logging, agree on who owns those global changes so that a change intended for one component does not unexpectedly silence another.

Periodic flushing requires thread-safe loggers

The README warns that periodic global flushing should only be used when all loggers are thread-safe. Check that convention before adding a global flush timer, especially when separate components construct their own loggers.

The asynchronous multiple-destination example explicitly selects a blocking overflow policy. Treat queue policy as an application choice and verify its behavior under a slow destination. Our recorded run did not exercise queue saturation or shutdown flushing.

Check timestamp behavior on the target platform

The v1.17.0 release notes describe changes to the %z UTC-offset formatter. They say the unreliable fallback was removed for Unix systems lacking tm_gmtoff. If compilation fails on those platforms, the documented option is SPDLOG_NO_TZ_OFFSET=ON, which makes %z display +??:??.

If downstream log processing requires a usable UTC offset, check the resulting timestamp on your target platform. These release notes describe v1.17.0; they do not establish that our measured commit d6c93f3 is the release tag or that our sandbox checked this behavior.

Alternatives depend on the work you need logging to do

{fmt} provides formatting and formatted output. Its README includes a stdout example. Consider it when formatted terminal messages cover your requirements and you do not need spdlog's logger and destination configuration. This is a choice about scope, not a measured performance advantage.

Quill is an asynchronous logging and metrics library for C++17 and later. Its README describes encoding arguments on application threads and processing them on a dedicated backend worker, where formatting and I/O occur. Evaluate that architecture if moving formatting away from application threads is a requirement. Our run provides no speed comparison with spdlog.

For a spdlog trial, use your intended destination and logging mode. Put a representative request identifier through that configuration, confirm the final output, and check flushing during application shutdown. Those are proposed next checks, not tests performed in the supplied run.

Alternatives

ProjectWhat it isPick it when
{fmt} gh↗A C++ formatting library with formatted output functions.Consider it when formatted terminal output covers your requirements and you do not need spdlog's logger and destination configuration. No comparative performance result was measured here.
QuillAn asynchronous logging and metrics library for C++17 and later.Evaluate it when you want arguments encoded on application threads and formatting and I/O performed by a backend worker. Its README documents that design; our run provides no comparative benchmark.

Sources

  1. spdlog README
  2. spdlog release v1.17.0
  3. {fmt} README
  4. Quill README

More dev tools reviews

QuickLook · kero · CalibRaw · ava · hiddify-app · betterleaks · the whole board →