Releases: StormByte-Suite/StormByte-Logger
Release list
Version 2.0.0
[Summary]
StormByte Logger is the stream-logging module of the StormByte C++ suite.
It depends directly on StormByte Base 2.0.0 or newer. This repository is not Base, Buffer, Config, Crypto, Database, Multimedia, Network or System.
Public headers under StormByte/logger/ cover Log, ThreadedLog, header formats (%L %T %i %c %g), hierarchical components and Scope facades, groups, ANSI colors, temporary formats, human-readable numbers and bytes, redaction of text and numbers, hex dumps (hex / nohex), and binary payloads (std::span<const std::byte>, default Base64). Owned text that crosses the logger DLL boundary uses StormByte::Safe::String / WString and StormByte::Safe::CString / WCString; StormByte::Size, StormByte::ByteSize and StormByte::BinaryData are accepted as payloads. Views and caller-owned std::string are consumed synchronously.
From 2.0.0, original Logger sources are dual-licensed: GNU Lesser General Public License v3.0 or later, or a commercial license from the copyright holder. That change does not cover other StormByte modules or third-party material under thirdparty/ (including bundled StormByte Base).
If you landed here from a release link and have not read the tree:
- What this module is, how to build it, and short examples: README.md
- License: dual license LGPL-3.0-or-later or commercial, LICENSE
Added
operator<<onLogandThreadedLogforStormByte::Safe::String,StormByte::Safe::WString,StormByte::Safe::CString,StormByte::Safe::WCStringandStormByte::Size. Conversion and copy run only whenWillWrite()is true.component,groupandpush_formatacceptstd::string_view(literals) in the caller andStormByte::Safe::Stringby value at the DLL boundary. Manipulator payloads use Base-owned text.- Private
StormByte::Logger::Detailhuman-readable number and IEC byte formatting (the manipulator API is unchanged; this logic no longer lives in String). - Tests for owned-text payloads, filtered drop of owned text,
Size, and ill-formed wide input substituted as U+FFFD. operator<<forStormByte::BinaryDataandStormByte::ByteSizeonLogandThreadedLog. Conversion runs only whenWillWrite()is true.operator<<onStormByte::Safe::SharedandStormByte::Safe::UniqueofLogorThreadedLog, same sugar asstd::shared_ptr:log << "Hola"without a dereference.~Logand~ThreadedLogare defined in the library, so the backend and the line lock are released inside the DLL. Copy and move assignment are too.
Changed
- Logger's text API and build metadata now use StormByte Base 2.0.0 directly; owned text and clone owners use Base's
StormByte::Safetypes. - Shared vs static follows CMake
BUILD_SHARED_LIBS(declared in the project root, default ON). There is noSTORMBYTE_LOGGER_SHAREDCMake option. When the library is shared, the compile definitionSTORMBYTE_LOGGER_SHAREDis still set sovisibility.hcan distinguishdllexport/dllimport/ static. CI passes-DBUILD_SHARED_LIBS=ON. Vendored StormByte Base follows the sameBUILD_SHARED_LIBSmode. - Breaking: Logger vendors StormByte Base 2.0.0 directly and exposes Base's
StormByte::Safeowned-text and ownership types in its public API. - Breaking: public streaming no longer treats
std::stringas an owned cross-module type. UseStormByte::Safe::String/StormByte::Safe::CStringwhen the buffer is owned by another module;string_viewremains valid for caller-owned data. A caller-ownedstd::stringis streamed inline as a view and copied synchronously. LevelToStringreturnsconst char*(a string literal) instead ofstd::string. Call sites that store it in astd::stringare unchanged.- The private backend is
Engine(m_engine), inengine.hxx/engine.cxx. It wasImplementation. - Filtered payloads (
WillWrite()false) return before any conversion or copy. A filtered or throttledstd::endldoes not touch the stream. An emitted line still forwards realstd::endl, so the text is flushed at that instant and the next payload prints a new header.std::endl/std::flush/std::endsare recognized without probing a string stream. - Breaking (boundary):
LogandThreadedLogno longer write anstd::ostreamfrom inside the DLL. Construction from anstd::ostreamstill works and still requires the stream to outlive the logger. Bytes and manipulators (std::endl) are applied byOStreamWrite/OStreamManipin the module that constructed the logger. A protected constructor takes those callbacks directly. - Breaking:
ThrottleSpec::ComponentandThrottleSpec::Grouparestd::optional<StormByte::Safe::String>. - Breaking: ill-formed wide text is written as U+FFFD (
EF BF BD). Logger does not throwStormByte::UTF8Erroron that path. Log::m_scope_pathisStormByte::Safe::Stringso a copied or derivedLogdoes not carrystd::stringacross a DLL boundary.- Numeric and narrow-text payloads share
Log::WriteValue;ThreadedLogonly overridesBeginPayloadfor those payloads. StormByte::Base64EncodereturnsStormByte::Safe::CString(Base 2.0.0). Binary-span default output is unchanged for the reader.- License: original Logger sources are dual-licensed LGPL-3.0-or-later or commercial. Third-party trees under
thirdparty/keep their own licenses. Neither license grants patent rights. - Breaking: with
hex(N)active,std::span<const std::byte>,std::vector<std::byte>andStormByte::BinaryDataare formatted withBinaryData::HexDump(N). Text, wide text and numbers still use the0xAAdump. Withouthex, binary payloads stay Base64. - Breaking:
Logger::ExceptiontakesException::Path{"Logger"}.what()isStormByte.Logger: message.Componentis gone.ThrottleErroris a leaf and adds no segment. Destructors are defined in this module. - Breaking:
LogisStormByte::Safe::Clonable<Log>, soClone,MoveandScopereturnStormByte::Safe::Shared<Log>allocated on Base's heap.std::shared_ptr<Log>is no longer aPointerType.Safe::Sharedstill converts tostd::shared_ptr<Log>and keeps Base's deleter. The same applies toThreadedLog.
Fixed
- Qualify the
ThrottleSpec::Levelmember type so public headers compile with GCC 14+ without-Wchanges-meaning; theLevelfield and designated-initializer API remain unchanged.
Version 1.2.0
[Summary]
StormByte Logger is the stream-logging module of the StormByte C++ suite.
It depends on StormByte Base 1.2.0 or newer. This repository is not Base, Buffer, Config, Crypto, Database, Multimedia, Network or System.
Public headers under StormByte/logger/ cover Log, ThreadedLog, header formats (%L %T %i %c %g), hierarchical components and Scope facades, groups, ANSI colors, temporary formats, human-readable numbers and bytes, redaction of text and numbers, hex dumps (hex / nohex), and binary payloads (std::span<const std::byte>, default Base64).
If you landed here from a release link and have not read the tree:
- What this module is, how to build it, and short examples: README.md
- License: GNU Lesser General Public License version 3 or later, LICENSE
Added
Log::Enabled(Level): print-floor query (Warning/Error/Fatal always true). Does not open a line and does not consult throttle.operator<<(std::string_view)andoperator<<(std::wstring_view)onLogandThreadedLog, with the same filtered early-out as other payloads.std::string/std::wstringconvert to the views.hex/hex(N)/nohex: dump subsequent payloads as spaced0xAAbytes.Nis bytes per row (default 16); wrap uses a raw newline without a new header and without ending the logical line.hex(0)isnohex. Applies to text, wide text (after UTF-8), numbers (42→ bytes of"42") and binary spans. Hex runs before redaction.operator<<(std::span<const std::byte>)onLogandThreadedLog. Default output is Base64 (StormByte::Base64Encode).std::vector<std::byte>converts to the span. Withhexthe dump is the raw bytes, not the Base64 text. Empty spans emit an empty payload.ThreadedLogformats the payload before taking the line lock (FormatBinary+WritePrepared).- Hierarchical components:
component("A")pushes a thread-local segment; nested pushes join with/for%cand config lookup.pop_componentpops one segment.reset_componentstill clears the stack.component("")does not push. Log::Scope(path)returns astd::shared_ptr<Log>facade with a sticky component path. NestedScopejoins relative to the parent. Never returnsnullptr. Facades share the backend and, onThreadedLog, the line lock. A Scope line uses the sticky path, not the TLS stack.- Protected
Clonable<Log, std::shared_ptr<Log>>onLog(Clone/Move) soScopecan copy the facade without exposing cloning in the public API. - Pointer
operator<<acceptsshared_ptr/unique_ptrwhose element typeType::DerivedFromLog(LogandThreadedLog).
Changed
- Dropped the dedicated
operator<<(const std::string&)/operator<<(const std::wstring&)overloads. Call sites that passstd::stringstill compile. ThreadedLogwide payloads encode withString::UTF8Encode(std::wstring_view)before taking the line lock.- Bundled StormByte Base is 1.2.0. Using
UTF8Encode(std::wstring_view)andBase64Encode(std::span<const std::byte>)requires Base 1.2.0 or newer. - Breaking:
no_redactis nownoredact, same shape asnocolor,nohexandnohumanreadable. There is no compatibility alias. - Breaking:
component("name")pushes onto the thread-local stack instead of replacing the current name. Sibling switches mustreset_componentorpop_componentfirst, otherwisecomponent("Media")thencomponent("Other")becomesMedia/Other. - Format and color lookup use the longest matching component-path prefix, then the general setting. A child format may introduce
%c/%geven when the parent format does not. - Throttle still picks the most specific rule; component matching is by path prefix and longer paths win.
Format/Color/Throttlewithout a component argument bind to the current facade path (Scopeleaf, or global on the root logger). - README documents the component stack,
Scope, hex dumps and binary payloads.
Fixed
~Implementationno longer first-touches thread-local line state (Valgrind still-reachable TLS at exit).- Inherited throttle rules keep one spec per prefix but one counter set per emitting path. A parent
Scope("Multimedia").Throttle(Debug, …)no longer letsEncoderconsumewatermarktokens or printwatermark dropped N messageswhen that leaf had not emitted anything at that level. Drop summaries stay on the leaf that dropped. Tests coverLogandThreadedLog.
Version 1.1.1
[Summary]
StormByte Logger is the stream-logging module of the StormByte C++ suite.
It depends on StormByte Base 1.1.0 or newer. This repository is not Base, Buffer, Config, Crypto, Database, Multimedia, Network or System.
Public headers under StormByte/logger/ cover Log, ThreadedLog, header formats (%L %T %i %c %g), components, groups, ANSI colors, temporary formats, human-readable numbers and bytes, and redaction of text and numbers.
If you landed here from a release link and have not read the tree:
- What this module is, how to build it, and short examples: README.md
- License: GNU Lesser General Public License version 3 or later, LICENSE
Changed
Version 1.1.0
[Summary]
StormByte Logger is the stream-logging module of the StormByte C++ suite.
It depends on StormByte Base 1.1.0 or newer. This repository is not Base, Buffer, Config, Crypto, Database, Multimedia, Network or System.
Public headers under StormByte/logger/ cover Log, ThreadedLog, header formats (%L %T %i %c %g), components, groups, ANSI colors, temporary formats, human-readable numbers and bytes, and redaction of text and numbers.
If you landed here from a release link and have not read the tree:
- What this module is, how to build it, and short examples: README.md
- License: GNU Lesser General Public License version 3 or later, LICENSE
Added
group("name")and%g; the group is cleared by newline and is not rendered in the body when%gis absent.- Sticky per-thread
component("name"),reset_componentand%c.component("")selects the root without throwing, whilereset_componentis the canonical reset. The state belongs to the thread, not theLog; twoLoginstances on one thread observe the same component. - ANSI colors by
Leveland component override, withcolor,color(Color::X)andnocolor. Color output is disabled by default. - Persistent general and component formats, plus nested
push_format/pop_format; an emptypop_formatis idempotent. - Expanded tests for colors, temporary formats, groups, components, threads, Unicode and lock recovery.
- Added configurable line throttle policies (
Drop,Sample,Window) with component/level/group rule precedence and drop summaries. - Added
FlushThrottle()and selectiveFlushThrottle(spec)for pending drop summaries at job boundaries.
Changed
- Requires StormByte Base 1.1.0 or newer (
ExceptionwithComponent). Logger did not use the two-stringExceptionconstructor. Warning,ErrorandFatalare always emitted, even when the configured floor is higher. This is intentional.- Expanded
ThreadedLogcoverage for the filtered hot path, wide conversion before locking, and recovery when Unicode conversion fails.
Fixed
ThreadedLog::FlushThrottlepreserves ownership of an already-held line lock.- Format changes now reset the active throttle line snapshot after closing an open line.
endlreleases theThreadedLogline lock even ifWillWrite()changes midway through a line.- Wide-string logging converts before acquiring the lock; a Unicode conversion error no longer terminates the logger from an internal
noexceptpath. - ThreadedLog::Write(Level) — two threads sharing a
ThreadedLograced onImplementation’soptional<Color>(m_content_color.reset()at the start of a line). The level token now takes the line lock like otherWriteoverloads; payload andendlalready did.
Version 1.0.0
[Summary]
StormByte Logger is the stream-logging module of the StormByte C++ suite.
It depends on StormByte Base. This repository is not Base, Buffer, Config, Crypto, Database, Multimedia, Network or System.
Public headers under StormByte/logger/ cover Log, ThreadedLog, header formats (%L %T %i), human-readable numbers and bytes, and redaction of text and numbers.
If you landed here from a release link and have not read the tree:
- What this module is, how to build it, and short examples: README.md
- License: GNU Lesser General Public License version 3 or later, LICENSE
Initial public release of StormByte Logger.
Added
Logstreaming facade withoperator<<- Level filter:
LowLevel,Debug,Warning,Notice,Info,Error,Fatal - Header format:
%L,%T,%i,%% - Manipulators:
humanreadable_number,humanreadable_bytes,nohumanreadable - Redaction:
redact/redact(N)keep last N;redact_first(N)keep first N;no_redact; applies to text and numbers ThreadedLog: one lock per logical line; filtered messages do not take the lock- Uses StormByte Base (
String,ThreadLock, platform) - Unit tests (filter, threads, redaction)
- Project version read from the
VERSIONfile - CMake 3.28 floor
Notes
Logis not thread-safe. UseThreadedLogwhen several threads share one logger.- Messages below the print level return early.
- Needs a C++26 compiler and StormByte Base ≥ 1.0.0.