- 🏗 Experimental builders will no longer change meaning of AST tokens ([#134]).
- The Blackhole is completely rewritten from the scratch, there is no need to duplicate README here.
- Integration with CodeCov ([#66]).
- Keep a changelog ([#67]).
- Embed libcppformat directly into the Blackhole ([#68]).
- Hide rapidjson symbols entirely ([#78]).
- All formatters, sinks and handlers no longer export their symbols and can be constructed only through associated factories as unsized objects.
- Inline namespaces ([#42]).
Allows to link together multiple libraries that are compiled with different Blackhole versions.
- Variadic placeholder filter policy for string formatter.
- 🐧 Arch Linux packaging and required fixes ([#45]).
- Lightweight process attribute is now available for OS X targets.
- Inline namespaces ([#42]). Allows to link together multiple libraries that are compiled with different Blackhole versions.
- 🖨 Optional printf-like syntax checking option.
Blackhole's printf-like syntax checking now can be disabled by configuring
- 🛠 Fixed corrupted move constructor for logger class.
Add missing copy of an exception handler when moving logger objects, which resulted in bad function call.
- Prevent throwing from pusher destructor ([#40]).
- 🖨 Optional printf-like syntax checking option. Blackhole's printf-like syntax checking now can be disabled by configuring
- Combined logger concept.
Now all loggers - are just sets of features combined in a single logger object. When specializing combined logger, you should specify additional parameters, by which filtering should occur when opening a record and before they will be merged with internal attributes set. For example you may specify no additional parameters and you get the simplest logger case. Another case - when you want to perform early filtering by verbosity level you can just specify its type with combination of base logger and the filtering function will require that level type.
- Filtering policies, which provide almost costless filtering.
A composite logger accepts additional policy parameter instead of mixed type and its argument pack. All methods, that opens a record now accepts variadic pack which is forwarded to that policy.
Additional attributes insertion into an internal set can be implemented using population trait, which is provided as first template parameter in a filtering policy.
- 👍 Threading policy support for logger ([#20]).
A composite logger can be configured with desired threading policy. That means if the logger doesn't require internal synchronization, it won't do it (if the corresponding policy is provided).
- Internal attributes attachment as a feature.
Every project should define which of internal attributes (PID, TID, etc.) should be attached to every logging event.
- 👍 Clang support on non OS X targets.
- 👀 Code coverage analyze using
lcovutil. No more words, just type
make coverageand you will see ([#38]).
- Multithreaded scalability benchmarks ([#36]).
- ✅ Huge number of benchmarks (approximately 300), that test every possible combination of cases. These are generated using preprocessor magic.
- 🔄 Changed attribute set underlying representation ([#18]).
Now attribute set is internally represented as vector of pairs. This change allows to keep attributes in single memory block, which is good for caching and performance. On the other hand attribute lookup time by user attributes may increase, because they are scanned using linear search. Also I don't see any need for handling duplicates, so now there can be duplicates (which actually can be eaten if needed). There are two attributes sets in every record: internal and external. Internal attributes is setting by logger itself: message, severity, timestamp, pid, tid or lwp. All attributes that is configured via scoped sets or wrappers - are external. This distribution allows me in the future to map each internal attribute with its unique number to perform even more faster table lookup.
This change increases performance of almost every case by approximately 20-30%.
- It's possible to forward all required arguments to final logger's constructor, while creating it through a repository.
- Logger's move constructor, move assignment operator and swap function no longer contain
noexceptspecifications, because given methods actually can throw. This change breaks API.
- Disabled tracking feature, because it shouldn't be in a logger itself, but somewhere else. This change breaks API.
- Verbose logger concept review.
No longer possible to open verbose logger's record without specifying severity level. This is required due to fact, that there is a primary filtering now, which strongly required severity level provided. Moreover there can be user specific filtering function that be cannot ignore.
- Proper verbose logger initialization with a given severity level.
No longer possible to initialize verbose logger with garbage level value, because user specific severity enumeration may start with any value. Instead of this, the User if forced to provide severity threshold explicitly. Verbosity threshold should always be specified, when setting verbosity to a logger, even with filtering function. This change breaks API.
- Redesign invalid record concept.
When opening a record there is a non-zero chance, that you will receive an empty record with no attributes attached. Previously it was considered as invalid record, because there was at least pid and tid attributes attached. But now seems to be there is no need to attach internal attributes before filtering. However now it is considered as valid, just without attributes. This change breaks API.
- Filtering function parameters review ([#33]).
Logging filtering function now accepts lightweight combined attribute set view. Technically it allows to perform faster filtering, because there is no need to construct combined set - it will be constructed only if the filtering succeed. This change breaks API.
- Deprecated file
blackhole/log.hppfile is no longer part of public API, just as planned. This change breaks API.
- 🔧 Internal and external attribute sets initial capacity can be configured using macro variables.
- 📚 Documentation has been slightly changed and restyled.
- ✅ No longer fetch gtest/gmock as submodules. Now these helpful frameworks are obtained via cmake download feature.
- No longer fetch benchmarking framework as submodule. Instead of that, cmake download feature is used.
- Got rid of several unnecessary file includes, which saves some compile time.
- Avoid unnecessary string copying or moving when comparing attributes.
- 🚚 Explicitly move the value when opening a record with a single attribute.
- ⬇️ Drop global logger attribute set.
After half year of user experience I've realized that nobody uses logging-attached attributes. The main reason of it - because of Wrappers. You can create logger wrapper, attach some attributes and work with it without copying underlying logger resources like file descriptors or sockets. As a result - you can have only one logger for application, but with multiple wrappers.
This is a big advantage, but this is a breaking change.
- ⬇️ Dropped logger concept classes, because it was inconvenient and buggy.
- 🛠 Fix string literal warnings on some ancient compilers.
- ↪ Workaround GCC 4.4 pragmas.
- 🔒 Checking frontend set emptiness is now always under the lock.
- 🛠 Fix possible conditional jump in tests.
To check results from functions, which can go the wrong way - is a good idea! Sometimes
strftimecannot fill provided buffer completely, because of initial format, for example. The best way for testing environment is to abort program execution and extend the buffer needed to match all cases.
- 🛠 Fix conditional jump in sticky stream ([#32]).
- 🛠 Fix comparing signed with signed and vise versa.
- 🛠 Fix broken resolver test.
- 🛠 Fix improper type mapping by name.
When registering Cartesian product of all possible formatters and sinks with the factory, they are internally mapped into typeid structure to be able to extract proper type factory by its name or by user-defined mapper trait.
Accidentally I've just forgot to write proper code for default case (mapping by entity name). Now the default type mapping checks whether type name is equal with the given one.
- 🛠 Fixed improper attributes routing. Accidentally all wrapper-attached attributes were routed to the internal section, which contain only internal attributes, like timestamp, severity or message.
Internal attributes are not shown in variadic placeholders, but all user-defined attributes should.
- String formatter now has optional placeholder, which can be fully ignored by the library, when it's not present in a record.
- 🔧 String formatter now can be configured with prefix, suffix and separator while using optional or variadic placeholders.
- String formatter has learned some convenient error-handling magic and can tell the User where and what type of error has happened.
- It's now possible to represent time value structure in local timezone.
- Any logger-compatible type (based on
logger_base_t) can be created through a repository.
- 🌲 Use compiler extension (cross-platform nonetheless) to check log message format correctness in compile time.
- 🗄 The library now widely uses deprecated attribute feature, which allows to reduce from version to version migration pain.
- ➕ Added logger trait concept.
- 📚 A lot of documentation added.
- 🔨 Log record has been completely refactored (and documented).
- Completely dropped all scope-specific stuff. Actually, there are three scopes left, but its management is fully incapsulated into the library.
- 🌲 Completely dropped
blackhole::log::*namespace, because it's already the Logging Library.
- Logger wrapper can now provide const reference to the underlying logger.
- ⬇️ Dropped 'in situ' substitution mechanism for keyword attributes, because it is creepy and useless.
- Base config objects now return const references instead of copying.
- 👍 Allow to use
_symbol in placeholder name.
- Attribute value holders are now comparable.
- Frontend factory now has more convenient interface.
- 🔧 Using specialized exception instead of more generic while parsing configuration object.
- More forward declarations, which may be useful with compile time reducing.
- Pack feeder now has overload that accepts string literal, which allows to avoid unnecessary transformations.
- Multiple attribute sets is aggregated into single
viewclass, so attribute lookup is performed lazily when it is needed by someone.
- String formatter now internally uses ADT instead of packed functions.
- Accelerated variadic placeholder handling in string formatter by approximately 30% via avoiding unnecessary string transformations.
- 🖨 Process id attribute is back and its extraction is much cheaper.
- Message attribute should no longer hangs out with external attributes.
- 🛠 Fix typo in GCC 4.6 detection macro.
- 🛠 Fix compatibility with GCC 4.4, which emitted false-positive warning.
- 🖨 Blackhole should no longer propagate exception raised from
boost::format, while formatting message string. Instead of this an exception reason will be printed as message.
- 🛠 Fix debian control especially for precise.
- 🚚 Move watcher for file sink, which can automatically reopen files after they were moved.