RFR (L): 8046148: JEP 158 Unified JVM Logging
marcus.larsson at oracle.com
Wed Sep 23 11:10:58 UTC 2015
Here is the third and hopefully final version of the patch.
* Use update_position() in logStream::write so that indent() works properly
* Add units (ms, ns) to all time decorations
* Additional comments
On 2015-09-15 11:36, Marcus Larsson wrote:
> Here is the updated version of the patch, including the feedback and
> suggestions from Coleen, David and Ioi.
> Incremental webrev:
> Full webrev:
> Changes include:
> * New NMT tag 'mtLogging' used by UL
> * Added storage allocation classes for all new classes
> * Added Log::puts<Level>(const char*) for plain string messages of any
> * Fixed broken printf-attribute on Log::write functions
> * Moved VM startup timestamp to after os::init
> * Formatting and code style changes
> On 2015-09-07 15:33, Marcus Larsson wrote:
>> Please review the following patch adding the unified logging
>> framework to hotspot.
>> See the JEP description for a general overview of the new feature.
>> Below are some notes on the implementation.
>> The patch adds the new 'share/vm/logging' subdirectory containing the
>> unified logging framework. The main entry point is log.hpp, which
>> contains the necessary macros and definitions to use the framework.
>> Log tags are defined/listed in logTag.hpp, and are passed as template
>> arguments to the Log class. Every combination of tags used in a log
>> call has a corresponding LogTagSet instance, which keeps a track of
>> all the outputs it should write the log message to (and their
>> levels). Having tags as template arguments allows mapping directly
>> from a set of tags to the LogTagSet instance, which means that the
>> overhead for disabled logging should be low. Currently each log
>> message can be tagged with up to 5 tags, but this can be increased if
>> ever required (and with C++11's variadic templates the limit can be
>> removed completely).
>> The LogConfiguration class keeps track of configured outputs (stdout,
>> stderr, and possible file outputs). Configuration is done either by
>> command line arguments (-Xlog) or by DCMD. Both methods will in turn
>> use the LogConfiguration class to perform the parsing &
>> configuration. This configuration includes iterating over all
>> LogTagSet instances and updating them accordingly. The
>> LogTagLevelExpression class is used to represent the selection of
>> tags and levels for a given configuration request (the
>> The LogDecorators class contains a selection of decorators. Instances
>> of this class is kept in LogTagSet to track what decorators to use
>> (this is the union of all decorators used by its outputs). Each log
>> call will create a LogDecorations instance (note: different classes),
>> which will contain the actual decoration strings for the log message.
>> These decorations are used for each output the tagset is set to log
>> on, and are then discarded.
>> The LogPrefix class allows messages of specific sets of tags to be
>> prefixed. The prefix should supply a printf-style format with
>> argument. (This allows GC logging to prefix messages of certain
>> tagsets with GCId.) Prefixes are implemented using template
>> specializations based on the specified tags, with the
>> general/unspecialized case giving an empty prefix.
>> The LogOutput class defines the interface for all types of log
>> outputs. LogFileStreamOutput corresponds to FILE* stream based log
>> outputs. LogFileOutput builds on this and adds the file management
>> and log rotation support.
>> A simple jtreg test is included in this patch. Additional tests will
>> be added at a later stage.
More information about the hotspot-dev