Uploaded image for project: 'WildFly Core'
  1. WildFly Core
  2. WFCORE-1494

Investigate consequences of changes in JDK9 on JBoss Logging

    XMLWordPrintable

Details

    • Task
    • Resolution: Done
    • Major
    • 3.0.0.Alpha1
    • 2.1.0.Final
    • Logging
    • None

    Description

      When running:

      $[wildfly-core/logging]>mvn test -Dtest=**/Log4jAppenderTestCase

      on JDK9 the test is failing.

      levelTest(org.jboss.as.logging.logmanager.Log4jAppenderTestCase)  Time elapsed: 0.006 sec  <<< ERROR!
      java.lang.IllegalStateException: The LogManager was not properly installed (you must set the "java.util.logging.manager" system property to "org.jboss.logmanager.LogManager")
      	at org.jboss.logmanager.Logger.getLogger(Logger.java:57)
      	at org.jboss.as.logging.logmanager.Log4jAppenderTestCase.<init>(Log4jAppenderTestCase.java:49)
      
      formatTest(org.jboss.as.logging.logmanager.Log4jAppenderTestCase)  Time elapsed: 0.001 sec  <<< ERROR!
      java.lang.IllegalStateException: The LogManager was not properly installed (you must set the "java.util.logging.manager" system property to "org.jboss.logmanager.LogManager")
      	at org.jboss.logmanager.Logger.getLogger(Logger.java:57)
      	at org.jboss.as.logging.logmanager.Log4jAppenderTestCase.<init>(Log4jAppenderTestCase.java:49)
      

      After short debugging I identified the difference between JDK8 and JKD9 that is causing the test to fail. In JDK8 the relevant piece of code was:

      // java.util.logging.Logger
      
         private static Logger demandLogger(String name, String resourceBundleName, Class<?> caller) {
              LogManager manager = LogManager.getLogManager();
              SecurityManager sm = System.getSecurityManager();
              if (sm != null && !SystemLoggerHelper.disableCallerCheck) {
                  if (caller.getClassLoader() == null) {
                      return manager.demandSystemLogger(name, resourceBundleName);
                  }
              }
              return manager.demandLogger(name, resourceBundleName, caller);
              // ends up calling new Logger(name, resourceBundleName, caller)
              // iff the logger doesn't exist already
          }
      

      in JDK9 the Security Manager check part disappeared:

      // java.util.logging.Logger
      
         private static Logger demandLogger(String name, String resourceBundleName, Class<?> caller) {
              LogManager manager = LogManager.getLogManager();
              if (!SystemLoggerHelper.disableCallerCheck) {
                  if (caller.getClassLoader() == null) {
                      return manager.demandSystemLogger(name, resourceBundleName, caller);
                  }
              }
              return manager.demandLogger(name, resourceBundleName, caller);
              // ends up calling new Logger(name, resourceBundleName, caller)
              // iff the logger doesn't exist already
          }
      

      This change causes the platform java.util.logging.Logger is returned instead of expected one
      org.jboss.logmanager.Logger.

      It is possible to workaround this problem by setting sun.util.logging.disableCallerCheck JVM property, like:

      $[wildfly-core/logging]>mvn test -Dtest=**/Log4jAppenderTestCase -Dsun.util.logging.disableCallerCheck=true

      Please investigate, whether this is regression that should be addressed by Oracle and if there are not other potential problems affecting proper logging functionality on JDK9.

      Attachments

        Issue Links

          Activity

            People

              jperkins-rhn James Perkins
              ropalka Richard Opalka
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: