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

Ioi Lam ioi.lam at oracle.com
Thu Sep 10 17:57:07 UTC 2015

I have two issues:

[1] There's a limit of 512 characters:

void Log<T0, T1, T2, T3, T4, GuardTag>::vwrite(const char* fmt, va_list 
args) {
   char buf[LogBufferSize];
   static const size_t LogBufferSize = 512;

I would need to log the names of loaded classes, which could be much 
longer. Would it be possible to add a new function like

   LogHandle(classload) log;
   log.puts<LogLevel::Info>("a very very very long string ..........");

[2] Although the Log::write function is declared with ATTRIBUTE_PRINTF, 
it doesn't seem to do the checking.

   static void write(const char* fmt, ...) ATTRIBUTE_PRINTF(1, 2);

I added these

void LogConfiguration::post_initialize() {
   assert(LogConfiguration_lock != NULL, "Lock must be initialized 
before post-initialization");
   LogHandle(logging) log;
   log.info("Log configuration fully initialized.");
+ log_info(logging)("hello %s");
+ tty->print_cr("hello %s");

I get a warning on the tty->print_cr line but not on the 
log_info(logging) line.

**NOTICE** Dtrace support disabled: This JDK does not support SDT probes
/home/iklam/jdk/ul/hotspot/src/share/vm/logging/logConfiguration.cpp: In 
static member function `static void LogConfiguration::post_initialize()':
error: format `%s' expects a matching `char*' argument [-Werror=format=]
    tty->print_cr("hello %s");
cc1plus: all warnings being treated as errors
make[4]: *** [logConfiguration.o] Error 1

My gcc is

$ gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 
4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs 
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr 
--program-suffix=-4.8 --enable-shared --enable-linker-build-id 
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix 
--with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib 
--enable-nls --with-sysroot=/ --enable-clocale=gnu 
--enable-libstdcxx-debug --enable-libstdcxx-time=yes 
--enable-gnu-unique-object --disable-libmudflap --enable-plugin 
--with-system-zlib --disable-browser-plugin --enable-java-awt=gtk 
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc 
--enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 
--with-multilib-list=m32,m64,mx32 --with-tune=generic 
--enable-checking=release --build=x86_64-linux-gnu 
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

- Ioi

On 9/9/15 12:33 AM, Marcus Larsson wrote:
> Hi,
> 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.
> Thanks,
> Marcus
>> 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