Skip to content

v13.1.0

Latest

Choose a tag to compare

@apozzer305 apozzer305 released this 17 Oct 11:17
78c0696
  • Added the opt-in QUILL_IMPORT_STD option for named module builds on toolchains supporting import std; standard library headers remain the default.
  • Added the --@quill//:std_module Bazel flag to configure the standard library module target for quill_module, automatically enabling QUILL_IMPORT_STD.
  • CMake and Bazel module targets now define QUILL_USE_MODULE automatically for consumers, while retaining compatibility with an explicit #define QUILL_USE_MODULE in source code.
  • Uncaught exceptions from Frontend logger creation and sink lookup or creation no longer leave manager locks held, allowing crash handlers to look up loggers and flush pending logs.
  • Added direct logging of arithmetic std::atomic<T> values via quill/std/Atomic.h, capturing each value on the calling thread.
  • Added the experimental quill_module target for Bazel 9+ consumers using C++20 and --experimental_cpp_modules, while preserving ordinary header-only builds on older Bazel versions.
  • Fixed C++20 module imports using separate logger state across translation units, which could prevent logger lookup and crash automatic backend shutdown.
  • Added Logger::publish_dynamic_metric() and DYNAMIC_METRIC() for runtime labels, sharing PrometheusSink series with pointer publishing; existing registrations configure both APIs.
  • Added PrometheusSink::register_*_family() to configure a metric family without creating a series. Use register_*_family() when there is no initial metadata pointer to register.
  • CMake, Meson, and Bazel consumers can use a separate fmtquill dependency for the bundled formatter without inheriting Quill's logging compile options, definitions, or link dependencies.
  • Fixed FileSink::open_file() retaining the old filename when a subclass reopens a different path, which could redirect later logs back to the original file.
  • FileSink now accepts custom filename timestamp formats that expand to an empty string, such as %p in locales without AM/PM markers.
  • StreamSink can retry signal-interrupted writes to streams configured with _IONBF by passing stream_is_unbuffered=true to its constructor; short writes on buffered streams still report errors.
  • Loggers using ClockSourceType::System no longer stall behind the timestamp-ordering grace check after a backward wall-clock correction.
  • RotatingFileSink now recognizes existing backup filename aliases during startup, preserving append-mode backups when the base filename spelling changes on a case- or normalization-insensitive filesystem.
  • On POSIX, Frontend::create_or_get_sink<FileSink>() now resolves existing file aliases, preventing duplicate sinks from truncating or reordering output to the same log file.
  • Backend now retries thread discovery after a caught allocation failure, allowing a newly registered thread's pending logs to be processed.
  • Fixed FileSink recovery after a deleted-file close callback throws, allowing later flushes to reopen the log.
  • %(process_id) now contains the process ID when records are processed by ManualBackendWorker.
  • With a dropping queue, Logger::flush_log() now reports outstanding drops through
    BackendOptions::error_notifier even when the thread that dropped the messages has exited.
  • Backend::stop() now processes records logged by FileEventNotifier::before_close or FileEventNotifier::after_close while destroying removed loggers' sinks. This applies when BackendOptions::wait_for_queues_to_empty_before_exit is enabled.
  • On Windows, Frontend::create_or_get_sink<FileSink>() now reuses an existing sink for equivalent casing or \\?\ spellings of the same path. In 'w' mode, this prevents a second sink from reopening and truncating that file.
  • Fixed FileSink failing to open long Windows paths supplied with a \\?\ prefix.
  • On Windows, timestamp suffixes enabled by FileSinkConfig::set_filename_append_option() now preserve Unicode fs::path names outside the active code page. RotatingFileSink also preserves these names during rotation and backup discovery.
  • Logging from an executable's BackendOptions::error_notifier no longer blocks with Logger::set_immediate_flush() enabled when Quill's backend runs in a Windows DLL.
  • With shutdown draining enabled, Backend::stop() now processes records logged by BackendOptions::error_notifier when Sink::flush_sink() fails at shutdown. Further error notifications while processing those records go directly to stderr.
  • After Backend::stop() followed by Backend::start(new_options), existing threads now format their MDC fields using the new BackendOptions::mdc_format_pattern.
  • On Windows, text written by FileEventNotifier::after_open now goes to the end of the file in append mode. FileEventNotifier::before_close now runs after pending FileSink writes have been flushed.
  • FileSink now releases its Windows file handle even when a buffered write fails during destruction.
  • PrometheusSink::unregister_metric() now allows a metric to be registered again with updated help text or a different type after the last metric with that name is removed.
  • Fixed an assertion when logging threads exit concurrently in debug builds or builds with QUILL_ENABLE_ASSERTIONS enabled.
  • Frontend::remove_logger_blocking() now flushes its sinks before returning even if the caller retains a std::shared_ptr<Sink>. Removal no longer loops when repeated Sink::flush_sink() failures trigger BackendOptions::error_notifier to log through another logger.
  • With Timezone::LocalTime, RotatingFileSink now returns to the time set by RotatingFileSinkConfig::set_rotation_time_daily() on following days if a daylight-saving change skips the scheduled time.
  • LOG_INFO with "{amount:.{precision}f} {currency}" now maps currency to the currency argument in JSON and %(named_args) output. It previously used the precision argument.
  • FileSink::flush_sink() now retries a failed reopen after an external deletion, allowing logging to resume if the directory becomes available again. On Windows, this also handles files marked for deletion while the sink's handle is still open.
  • LOG_INFO(logger, "{}", std::tie(symbol)) now handles a referenced char[N] without a null terminator using its array length.
  • When Codec<T> uses DeferredFormatCodec<T>, logging std::tie(object) or a temporary pair containing lvalue references no longer moves from those referenced objects.
  • On Linux/macOS, SignalHandlerOptions::timeout_seconds now works when the alarm interrupts the thread already handling the signal during a stalled flush. The original signal's default termination and core-dump behavior is preserved.
  • Logger::set_mdc() and Logger::erase_mdc() now reject requests larger than a QueueType::BoundedDropping queue rather than retrying indefinitely. Application threads still retry when the request fits but the queue is temporarily full.
  • Fixed DeferredFormatCodec types that also convert implicitly to std::string, such as nlohmann::json, bypassing their formatter on the backend; the conversion was logged instead, or a throwing conversion produced "[Quill deferred decode failed]" (aborting in QUILL_NO_EXCEPTIONS builds).