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

Marcus Larsson marcus.larsson at oracle.com
Fri Sep 11 13:03:50 UTC 2015



On 2015-09-11 14:38, Coleen Phillimore wrote:
>
> Marcus,  Thanks for the reply.   Two short comments (see if you can 
> find them).
>
> On 9/11/15 4:25 AM, Marcus Larsson wrote:
>> Hi,
>>
>> On 2015-09-10 22:30, Coleen Phillimore wrote:
>>>
>>> Hi Marcus,
>>>
>>> This code looks well written and documented in terms of appropriate 
>>> comments in the header files.
>>>
>>> I have a few comments:
>>>
>>> 1.  The NEW and strdup_check_oom() and other memory allocation 
>>> functions use a combination of mtInternal and mtOther, neither of 
>>> which is really going to be helpful for finding memory leaks in 
>>> this.   Can you add an mtLogging tag and use that? There is one 
>>> strdup without an NMT tag (somewhere).
>>
>> Ah, nice catch. I'll fix this!
>>
>>>
>>> 2.  The header files end with #endif but no // BLAH to match the 
>>> #ifdef in the header guard.   Can you add all of these?
>>
>> OK.
>>
>>>
>>> 3.  Nice job adding #includes in alphabetical order.  This is the 
>>> only file that they are not:
>>> http://cr.openjdk.java.net/~mlarsson/8046148/webrev.00/src/share/vm/logging/logFileOutput.hpp.html 
>>>
>>
>> Darn it, thought I had them all. Will fix.
>>
>>>
>>> 4. Some classes don't have storage allocation classes.  It looks 
>>> like they should be VALUE_OBJ_CLASS_SPEC.   Eg. LogOutputList, 
>>> LogDecorations, LogTagSet, LogTag (AllStatic),
>>
>> OK.
>>
>>>
>>> 5. In 
>>> http://cr.openjdk.java.net/~mlarsson/8046148/webrev.00/src/share/vm/logging/logTag.hpp.html 
>>> there is unlikely to be a general 'rt' tag since runtime covers a 
>>> broad set of different features in the vm.
>>
>> I'll remove it along with all the other currently unused tags. If 
>> they're needed we can just add them with the change adding logging 
>> for them.
>>
>>>
>>> Around line 51 in this file, can you explain that MaxTags is that 
>>> you can only give so many tags in any given logging call, not that 
>>> we can only define 5 tags total.   Also, giving a description of how 
>>> to specify more than one tag and what it means (union or 
>>> intersection of that logging tag) would be good to have here too.
>>
>> I'll try to clarify this with some comments.
>>
>>>
>>> On line 58, can Count be "TagCount" or something a bit more 
>>> descriptive?
>>
>> All enums introduced follow this pattern, and when they're used they 
>> must be prefixed with the class they belong to, in this case 
>> LogTag::Count. I think this looks good but I can change it if you 
>> want to. If so, do you want me to make similar changes to 
>> LogLevel::Count and LogDecorators::Count as well?
>
> I only saw Count in logTag.cpp so it looked odd.   Qualified, it looks 
> ok.   Can you qualify it in logTag.cpp instead?

Sounds good!

>>
>>>
>>> 6. In log.hpp can this really long line be broken up to something 
>>> reasonable around 100 chars?
>>>
>>> template <LogTagType T0, LogTagType T1 = LogTag::__NO_TAG, 
>>> LogTagType T2 = LogTag::__NO_TAG, LogTagType T3 = LogTag::__NO_TAG, 
>>> LogTagType T4 = LogTag::__NO_TAG, LogTagType GuardTag = 
>>> LogTag::__NO_TAG>
>>> class Log {
>>
>> OK.
>>
>>>
>>> Thank you for the examples on how to use these.   The template macro 
>>> combinations are pretty insane.   We used to not be allowed to use 
>>> templates in Hotspot.
>>
>> They would be simpler if we had C++11's variadic templates. Now we're 
>> sort of emulating this with up to five tags, which makes it a bit messy.
>>
>>>
>>> 7. In general, could you add a blank line between the header guards 
>>> in the file and the #include statements?
>>>
>>> #ifndef SHARE_VM_LOGGING_LOG_HPP
>>> #define SHARE_VM_LOGGING_LOG_HPP
>>> #include "logging/logLevel.hpp"
>>
>> OK.
>>
>>>
>>> 8. In logTag.hpp there is MaxTags = 5 but the log.hpp file 
>>> definitions have only 5 tags.  It seems like MaxTags should be 
>>> specified there instead or at the top level.
>>
>> I really wanted to have it in the Log class, but then to use it one 
>> would have to specify the tag template argument 
>> (Log<LogTag::some_tag>::MaxTags rather than Log::MaxTags). Should I 
>> rename it to LogMaxTags and make it a global constant (in log.hpp) 
>> instead?
>
> How about just adding a comment then.   I see your point.

Alright, I'll do that.

Thanks again,
Marcus

>
> thanks,
> Coleen
>>
>>>
>>> 9. At the end of logTagSet.hpp, I can't guess what this line is:
>>>
>>> template <LogTagType T0, LogTagType T1, LogTagType T2, LogTagType 
>>> T3, LogTagType T4>
>>> LogTagSet LogTagSetMapping<T0, T1, T2, T3, T4>::_tagset(T0, T1, T2, 
>>> T3, T4);
>>>
>>> it looks like a constructor call.  yes it is.  Can you add a comment 
>>> or something for people who's decoding skills with templates isn't 
>>> as strong?   And you have to define the static field _tagset in the 
>>> .hpp file because it's a template.
>>
>> I'll add comments.
>>
>>>
>>> Can you break up the long template line for LogTagSetMapping also?
>>
>> OK.
>>
>>>
>>> This is all I have for now.  This is a much larger change than I 
>>> appreciated in my pre-review, but I still don't see anything bad at 
>>> all.
>>>
>>> Thanks,
>>> Coleen
>>
>> Thank you for reviewing!
>>
>> Regards,
>> Marcus
>>
>>>
>>> On 9/7/15 9: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