Fast asynchronous logging and metrics for low-latency C++ applications.
Quill keeps formatting and I/O off your hot threads: LOG_* macros binary-serialize arguments into a thread-local lock-free queue, and a single backend worker reconstructs, timestamp-orders, formats, and writes them.
Quick Example¶
#include "quill/LogMacros.h"
#include "quill/SimpleSetup.h"
int main()
{
auto* logger = quill::simple_logger();
LOG_INFO(logger, "Hello from {}!", "Quill");
}
A macro-free interface (quill::info(), quill::warning(), …) is also available — see Macro-Free Mode.
Use Quick Start for the smallest setup, or move to the full
Backend / Frontend APIs when you need custom sinks, multiple loggers, metrics,
or more explicit lifecycle control.
Highlights¶
Nanosecond hot path — binary-copy arguments into a per-thread SPSC queue, defer formatting to the backend.
Timestamp-ordered logs — a single backend worker merges events from all frontend queues chronologically.
Publish metrics on the same pipeline — send pre-registered metric samples to Prometheus, StatsD, OpenTelemetry, or any custom collector through the same backend worker (built-in
PrometheusSinkincluded). Quill is the low-latency transport, not a metrics system itself.Mapped Diagnostic Context — attach per-thread key/value context that appears on subsequent log lines automatically. See MDC.
Rich STL and user-type support — codecs for
std::vector,std::map,std::variant,std::chrono,std::bitset,std::complex,std::error_code, nested containers, and your own types.Structured JSON output, rotating sinks, filters, backtrace logging, custom clocks, and more.
Start Here¶
Get Started for the shortest path to working logs
Installing for package manager and source setup
Guides for sinks, metrics, formatters, JSON, filters, and more
Recipes for common tasks and examples
FAQ for integration guidance and common pitfalls