Review request: 8011380: FX dependency on PlatformLogger broken

Mandy Chung mandy.chung at oracle.com
Fri Apr 5 15:38:03 UTC 2013


Laurent,

I believe this was mentioned somewhere in j.u.logging.  A better 
solution may be to take java.util.function.Supplier parameter that 
constructs the log message lazily (see 
http://download.java.net/jdk8/docs/api/java/util/logging/Logger.html#fine(java.util.function.Supplier). 
I can file a RFE to investigate the use of Supplier as in j.u.l.Logger.

Thanks
Mandy

On 4/5/2013 1:55 AM, Laurent Bourgès wrote:
> Mandy,
>
> I would like to add few performance advices in the PlatformLogger Javadoc:
> "
> NOTE: For performance reasons, PlatformLogger usages should take care 
> of avoiding useless / wasted object creation and method calls related 
> to *disabled* log statements:
> Always use isLoggable(level) wrapping logs at levels (FINEST, FINER, 
> FINE, CONFIG):
>
> Bad practices:
> - string concat:
> log.fine("message" + value); // means 
> StringBuilder(message).append(String.valueOf(value)).toString(): 2 
> objects created and value.toString() called
> - varags:
> log.fine("message {0}", this); // create an Object[]
>
> Best practices:
> if (log.isLoggable(PlatformLogger.FINE) {
> log.fine("message" + value);
> }
>
> if (log.isLoggable(PlatformLogger.FINE) {
> log.fine("message {0}", this);
> }
> "
>
> What is your opinion ?
>
> Thanks for the given explanations and I hope that this patch will be 
> submitted soon to JDK8 repository.
>
> Laurent
>
> 2013/4/4 Mandy Chung <mandy.chung at oracle.com 
> <mailto:mandy.chung at oracle.com>>
>
>     Alan - can you review this change?
>
>     I have changed Level.valueOf(int) to return the nearest Level as
>     Peter suggests using binary search:
>     http://cr.openjdk.java.net/~mchung/jdk8/webrevs/8011380/webrev.01/
>     <http://cr.openjdk.java.net/%7Emchung/jdk8/webrevs/8011380/webrev.01/>
>
>     I want to push the changeset tomorrow since we need this fix
>     before the TL integration.
>
>     Several questions were brought up and I'm answering them in one shot:
>     1. The PlatformLogger static final fields have to retain the same
>     since existing code can call:
>         int level = PlatformLogger.FINE;
>         logger.setLevel(level);
>
>     There is also native code accessing PlatformLogger fields (will
>     need to investigate more).  Once we fix this type of
>     incompatibility references, we can change them.  Or we could
>     remove these static final constants completely but it's less
>     preferable since it touches many of the JDK files.  I would keep
>     these static fields as a shortcut.
>
>     2. New convenient methods (isInfoLoggable, isWarningLoggable) to
>     minimize the dependency to the constants
>
>     It's not a problem to have the dependencies.  This is an issue
>     this time since we were not aware of such dependency.  The
>     isLoggable method is simple enough.
>
>     3. 3 methods with two versions (one with int and one with Level
>     parameter)
>
>     As I said, I'll file a bug to remove the 3 deprecated methods in
>     jdk8. I'm certain I can do so but just take some time to
>     synchronize the changes.
>
>     4. It's true that you can set a PlatformLogger with a custom level
>     via PlatformLogger API.  But you can access a platform logger
>     using java.util.logging API.
>
>      
>      Logger.getLogger("sun.awt.someLogger").setLevel(MyLevel.CUSTOM_LEVEL);
>
>     PlatformLogger.getLevel() has to return some thing.  Laurent
>     suggests to remove (deprecate) PlatformLogger.getLevel() or
>     level() method.  I have to understand how the FX code uses
>     getLevel().  We have to keep it due to the regression and for
>     testing.  For API perspective, having a method to find what level
>     it's at is reasonable.  Since we now have a clean solution to deal
>     with custom level, I don't see any issue keeping it.
>
>     5. JavaFX 8 is likely to switch to build with JDK8 in a few weeks
>     (really soon).
>
>     6. Level.intValue() public or not
>
>     It mirrors java.util.logging.Level but may be able to do without
>     it.  Let's leave it public for now until FX converts to use the
>     new code.  I can clean this up at the same time.
>
>     Mandy
>
>
>
>     On 4/3/13 9:52 PM, Mandy Chung wrote:
>
>         Peter, Laurent,
>
>         History and details are described below.
>
>         Webrev at:
>         http://cr.openjdk.java.net/~mchung/jdk8/webrevs/8011380/webrev.00/
>         <http://cr.openjdk.java.net/%7Emchung/jdk8/webrevs/8011380/webrev.00/>
>
>         I add back the getLevel(int), setLevel(int) and
>         isLoggable(int) methods but marked deprecated and also revert
>         the static final variables to resolve the regression. They can
>         be removed when JavaFX transitions to use the Level enums
>         (I'll file one issue for FX to use PlatformLogger.Level and
>         one for core-libs to remove the deprecated methods).  The
>         performance overhead is likely small since it's direct mapping
>         from int to the Level enum that was used in one of your
>         previous performance measurement.
>
>         Laurent - you have a patch to add isLoggable calls in the
>         awt/swing code. Can you check if there is any noticeable
>         performance difference?
>
>         I also take the opportunity to reconsider what
>         JavaLoggerProxy.getLevel() should return when it's a custom
>         Level. Use of logging is expected not to cause any fatal error
>         to the running application.  The previous patch throwing IAE
>         needs to be fixed.  I propose to return the first
>         Level.intValue() >= the custom level value since the level
>         value is used to evaluate if it's loggable.
>
>         History and details:
>         JavaFX 8 has converted to use sun.util.logging.PlatformLogger
>         (https://javafx-jira.kenai.com/browse/RT-24458). I was
>         involved in the early discussion but wasn't aware of the
>         decision made.  Thanks to Alan for catching this regression
>         out before it's integrated to jdk8.  jfxrt.jar is cobundled
>         with jdk8 during the installer build step.  My build doesn't
>         build installer and thus we didn't see this regression.
>
>         I ran jdeps on jdk8/lib/ext/jfxrt.jar (windows-i586) that
>         shows 112 references to PlatformLogger and on
>         jdk7/lib/jfxrt.jar that shows no reference to sun.util.logging.
>
>         I have a method finder tool (planning to include it in jdk8)
>         to search for use of PlatformLogger.getLevel and it did find 2
>         references from jdk8/lib/ext/jfxrt.jar.
>
>         JavaFX 8 is going to upgrade to use JDK 8 for JavaFX build
>         (https://javafx-jira.kenai.com/browse/RT-27794) soon
>         (currently it's built with JDK 7).  As soon as JavaFX code are
>         changed to reference PlatformLogger.Level enum instead, we can
>         remove the deprecated methods and change the PlatformLogger
>         constants.
>
>         JavaFX 2.2.x doesn't use sun.util.logging and so this has no
>         impact to it.  In any case, JavaFX 2.2.x only runs either
>         bundled with a corresponding JDK 7u release, or as a
>         standalone library for JDK 6 only.
>
>         Thanks
>         Mandy
>
>
>




More information about the core-libs-dev mailing list