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 PrometheusSink included). 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