All notable changes are documented in this file.
- Timestamp (
ts, ISO-8601 UTC) andlevelfields in every JSON line. - Native JSON typing for fields: integers, unsigned integers,
double, andboolare emitted unquoted (e.g.{"n":42});kvgained overloads for these types andconst char*. RotatingFileSink(size-based rotation with a bounded number of backups).Logger::flush()to block until everything submitted so far is written, plus aSink::flush()hook (default no-op) honored on flush and destruction.clear_sinks()to drop the default console sink, and a configurable async queue capacity viaLogger(Mode, capacity).- CMake build (
clogpp::clogppinterface target),ctestintegration, and CI on Linux, macOS, and Windows. - Regression tests for level filtering, async losslessness, JSON field shape, and rotation.
- Level filtering now works.
set_level()was previously never consulted, so all levels were emitted regardless. - Async logging is now lossless. Earlier versions ignored the queue-full signal and silently dropped entries under load (a tight loop could lose the large majority of its logs), and the shutdown drain discarded entries. The queue now applies backpressure and drains completely before the worker exits.
- Concurrent logging is now safe. Per-entry state moved onto a per-statement
LogRecord, removing the shared mutable builder that races when multiple threads log on oneLogger.
info()/error()/etc. now return aLogRecord(which emits when it goes out of scope) instead ofLogger&. Existing chained usage —log.info("e").kv("k", v);— is unchanged.- Documentation no longer describes the async path as "lock-free"; it is a mutex-synchronized multi-producer queue. Benchmarks were re-measured end-to-end.
- First public release: async-by-default logger with background draining and JSON output.
- File/console sinks and a chainable API.
- Initial test suite and CI.