RFR (L): 8046148: JEP 158 Unified JVM Logging

Marcus Larsson marcus.larsson at oracle.com
Wed Sep 9 07:33:06 UTC 2015


On 2015-09-08 22:53, Ioi Lam wrote:
> Also, is it possible to combine the output of two tags into a single 
> file, like this?
>      -Xlog:gc:file=out.txt -Xlog:comp:file=out.txt
> this way, I can have both GC and Compiler logs that's in an 
> (approximate) temporal order. The alternatives are:
> - write both to stdout -- but I need to filter out junk that I don't want
> - write to different files -- but I lose the relative ordering between 
> the two sets of logs
> From the current patch, it seems like if I assign the same file name 
> to two tags, fopen() will be called twice and the result will be 
> platform dependent.
> - Ioi

This is indeed possible! The syntax for configuring this would be 
-Xlog:gc,comp:file=out.txt. Configuring logging for the same output 
multiple times only overrides/replaces the previous configuration. The 
second fopen will not happen, because the log configuration will notice 
the output already exists and simply reconfigure the existing output.


> On 9/8/15 1:26 PM, Ioi Lam wrote:
>> Hi Marcus,
>> I am eagerly waiting for this to implement a new logging feature in 
>> the VM. How much testing has been done on this patch? I can see only 
>> two locations where any logs are bring generated:
>> +    log_error(logging)("%s", errbuf);
>> +    log_error(logging)("Could not open log file '%s' (%s).\n", 
>> _file_name, strerror(errno));
>> Do you have a follow-on patch that's already in work to test the 
>> various functionalists of the Unified JVM Logging framework? I am 
>> asking so that I can know how much surprise to expect when I start 
>> using it.
>> Thanks
>> - Ioi
>> On 9/7/15 6:33 AM, Marcus Larsson wrote:
>>> Hi,
>>> Please review the following patch adding the unified logging 
>>> framework to hotspot.
>>> JEP:
>>> https://bugs.openjdk.java.net/browse/JDK-8046148
>>> Webrev:
>>> http://cr.openjdk.java.net/~mlarsson/8046148/webrev.00/
>>> 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 
>>> "what"-expression).
>>> 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.
>>> Thanks,
>>> Marcus

More information about the hotspot-dev mailing list